For example:
{1, 3, 2, 6, 9}, there are 3 elements larger than or equal to 3. Maximum k = 3.
{1, 3, 4, 6, 9}, there are 4 elements larger than or equal to 3. Maximum k = 3;
{1,1,1}, there are 3 elements larger than or equal to 1. Maximum k = 1;
Analysis:
Suppose the array A is sorted for largest to smallest.
1) A[i] > i means that all elements from 0 to i are larger than or equal to i. Maximum k >= i.
2) A[i] == i means that A[i+1] < i+1, thus maximum k = i
3) A[i-1] > i-1 && A[i] < i. From A[i-1] > i-1 we know A[i-1] >= i. Maximum k = i;
So, we need to find out the first element smaller than or equal to i.
bool lt(int a, int b){return a>b;}
int findPivotCount(vector<int>& A)
{
int len = A.size();
if(0 == len) return 0;
sort(A.begin(), A.end(), lt);
for(int i=0;i<len;i++)
{
if(A[i] <= i) return i;
}
return len;
}
This solution will take O(nlogn). Let's give an O(n) solution.
Note that fact the result is at largest n, which is the length the array. Let b[i] be the count of elements with value i. sum(b[j]), i<=j<=n will be the count of elements whose values are larger than or equal to i.
int findPivotCount(vector<int>& A)
{
int len = A.size();
vector<int> b(len+1, 0);
for(int i=0;i<len;i++)
{
if(A[i]<0) continue;
int t = A[i]>len?len:A[i];
b[t]++;
}
int sum = 0;
for(int i=len;i>=0;i--)
{
sum += b[i];
if(sum >= i) return i;
}
return 0;
}