Accolite采访:
输入:整数数组(未给出范围),未排序,大小为n
输出:在数组中找到一个元素“k”,这样数组中的确切“k”元素大于此元素。
例如,如果数组是:
1。 [4,3,6,9,10,22] 这里的输出是4
2。 [4,3,6,9,10] 输出:没有找到这样的号码
这个问题可以通过在O(n log n)时间内排序很容易地完成,但我被要求在O(n)时间内完成(如果O(logn)可能)。
答案 0 :(得分:0)
有人帮忙,这是解决方案
注意事项:“K”不能大于数组的大小。 我们将有一个大小等于给定数组的count数组。
assuming indexes start from 1
for(i=1;i<=n;i++)
{
if(a[i]<=n)
count[a[i]-1]++;
else
count[n]++;
}
boolean flag=false;
for(i=n-1;i>=1;i--)
{
if(count[i]==i)
{
flag=true;
System.out.println("k: "+i);
}
}
if(flag==false)
System.out.println("No such number found);
}
答案 1 :(得分:0)
int[] count = new int[ n + 2 ];
for ( int k = 0; k < n; ++k )
++count[ Math.min( n + 1, Math.max( 0, a[ k ] + 1 ) ) ];
int k = n, c = count[ n + 1 ];
for ( ; k > 0 && ( 0 == count[ k ] || k != c ); c += count[ k-- ] );
System.out.println( 0 == k ? "not found" : "found: " + k );