Maximum value K such that array has at-least K elements that are >= K - GeeksforGeeks
Given an array of positive integers, find maximum possible value K such that the array has at-least K elements that are greater than or equal to K. The array is unsorted and may contain duplicate values.
Method 2 [Efficient : O(n) time and O(n) extra space] 
1) The idea is to construct axillary array of size n + 1, and use that array to find count of greater elements in input array. Let the auxiliary array be freq[]. We initialize all elements of this array as 0.
 
 
 
 
 
 
 
 
Read full article from Maximum value K such that array has at-least K elements that are >= K - GeeksforGeeks
Given an array of positive integers, find maximum possible value K such that the array has at-least K elements that are greater than or equal to K. The array is unsorted and may contain duplicate values.
1) The idea is to construct axillary array of size n + 1, and use that array to find count of greater elements in input array. Let the auxiliary array be freq[]. We initialize all elements of this array as 0.
2) We process all input elements.
a) If an element arr[i] is less than n, then we increment its frequency, i.e., we do freq[arr[i]]++.
b) Else we increment freq[n].
a) If an element arr[i] is less than n, then we increment its frequency, i.e., we do freq[arr[i]]++.
b) Else we increment freq[n].
3) After step 2 we have two things.
a) Frequencies of elements for elements smaller than n stored in freq[0..n-1].
b) Count of elements greater than n stored in freq[n].
a) Frequencies of elements for elements smaller than n stored in freq[0..n-1].
b) Count of elements greater than n stored in freq[n].
Finally, we process the freq[] array backwards to find the output by keeping sum of the values processed so far.
int findMaximumNum(unsigned int arr[], int n){    // construct axillary array of size n + 1 and    // initialize the array with 0    vector<int> freq(n+1, 0);    // store the frequency of elements of    // input array in the axillary array    for (int i = 0; i < n; i++)    {        // If element is smaller than n, update its        // frequency        if (arr[i] < n)            freq[arr[i]]++;        // Else increment count of elements greater        // than n.        else            freq[n]++;    }    // sum stores number of elements in input array    // that are greater than or equal to current    // index    int sum = 0;    // scan auxillary array backwards    for (int i = n; i > 0; i--)    {        sum += freq[i];        // if sum is greater than current index,        // current index is the answer        if (sum >= i)            return i;    }}int findMaximumNum(unsigned int arr[], int n){    // output can contain any number from n to 0    // where n is length of the array    // We start a loop from n as we need to find    // maximum possible value    for (int i = n; i >= 1; i--)    {        // count contains total number of elements        // in input array that are more than equal to i        int count = 0;        // traverse the input array and find count        for (int j=0; j<n; j++)            if (i <= arr[j])                count++;        if (count >= i)          return i;    }        return 1;}