Find the smallest and second smallest elements in an array(查找数组中第二小的元素)
Difficulty Level : Basic
Find the smallest and second smallest elements in an array.
Example:
1 2 3
Input: arr[] = {12, 13, 1, 10, 34, 1} Output: The smallest element is 1 and second Smallest element is 10
解题思路
A Simple Solution is to sort the array in increasing order. The first two elements in sorted array would be two smallest elements. Time complexity of this solution is O(n Log n). A Better Solution is to scan the array twice. In first traversal find the minimum element. Let this element be x. In second traversal, find the smallest element greater than x. Time complexity of this solution is O(n). The above solution requires two traversals of input array. An Efficient Solution can find the minimum two elements in one traversal. Below is complete algorithm. Algorithm:
1 2 3 4 5 6 7
1) Initialize both firstandsecond smallest as INT_MAX first = second = INT_MAX 2) Loop through all the elements. a) If the current element is smaller than first, then update first andsecond. b) Else ifthe current element is smaller than secondthen update second
// C program to find smallest and second smallest elements #include<stdio.h> #include<limits.h>/* For INT_MAX */
voidprint2Smallest(int arr[], int arr_size) { int i, first, second;
/* There should be atleast two elements */ if (arr_size < 2) { printf(" Invalid Input "); return; }
first = second = INT_MAX; for (i = 0; i < arr_size ; i ++) { /* If current element is smaller than first then update both first and second */ if (arr[i] < first) { second = first; first = arr[i]; }
/* If arr[i] is in between first and second then update second */ elseif (arr[i] < second && arr[i] != first) second = arr[i]; } if (second == INT_MAX) printf("There is no second smallest element\n"); else printf("The smallest element is %d and second " "Smallest element is %d\n", first, second); }
/* Driver program to test above function */ intmain() { int arr[] = {12, 13, 1, 10, 34, 1}; int n = sizeof(arr)/sizeof(arr[0]); print2Smallest(arr, n); return0; }
Output :
1
The smallest element is1andsecond Smallest element is10
The same approach can be used to find the largest and second largest elements in an array. Time Complexity: O(n)