最近どこかで出会ったこの本当に良いインタビューの質問があり、これに対する最も最適化された解決策は何かをすべての天才に尋ねたかった. したがって、問題は次のとおりです。整数の配列が与えられた場合、n より大きい配列要素が少なくとも n 個存在するような最大数 n を見つけます。入力配列はソートされていません。
例:
入力 : 1,2,5,7,8,10 出力 : n = 4
入力 : 0,2,7,8,19,5,45,9,23 出力 : n = 6
私が考えることができる1つの解決策(配列がソートされている場合)は、配列内のすべての要素を順次スキャンして、min:nとmax:nを見つけることです。次に、min:n から max:n までの整数をインクリメントし、1 つずつチェックアウトします。しかし、これは O(N) ソリューションです。誰かがより良いものを提案できますか?
例: 入力 1 min:n = 2 および max:n = 5
の場合、答えとして数字 2、3、および 4 をチェックします。
答えからわかるように、配列がソートされていない場合、O(N) ソリューションに勝るものはありません。しかし、次の質問は、指定された配列がソートされている場合はどうなるでしょうか?
pseudocode :
// this assumes sorted input.
pubic int findhighestIndex(List<Integer> input){
it min=0,max=0,n=0,maxIndex=0;
for(int i=0;i<input.size();i++){
if( input.get(i)>(input.size()-i) ){
max=input.get(i);
maxIndex=i;
min=input.get(i-1);
break;
}
else if(input.get(i)<(input.size()-i)){
max=min=input.get(i);
}
}
int i=max;
while( i>=min && (input.size()-maxIndex)<i ){
i--;
}
System.out.println(i);
}
更新: この問題は、h-index の検索とも呼ばれます