サイズMとNのソートされた2つの配列が与えられた。私は時間の複雑さO(logM + logN)を持つアルゴリズムを実装しようとしていた。戦略は基本的に、長さ条件に基づいて2つのサブアレイからの中間インデックス要素を比較しています。2つのソートされた配列からk番目に小さい要素を見つける
// Test case 1
// Works for all position except when kth is 6
int[] num1 = {6,7,8,9,10,11,12};
int[] num2 = {1,2,3,4,5};
// Test case 2
// Always print the next smallest element
int[] num3 = {1,3,5,7,9};
int[] num4 = {2,4,6,8,10,12,14,16,18,20,22,24,30,40,50,56,77,35};
public static int findKth(int[] A, int p1, int r1, int[] B, int p2, int r2, int k){
if (p1 > r1) {
return B[p2+k-1];
} else if (p2 > r2) {
return A[p1+k-1];
}
int midA = p1 + (int)Math.floor((r1-p1)/2);// Middle element from subarray A
int midB = p2 + (int)Math.floor((r2-p2)/2);// Middle element from subarray B
/**
* Compare the sum of number of elements from left-subarray up to middle element.
*/
if ((midA-p1+midB-p2+2) < k) {
// We don't need to the left-subarray based on the comparisons between middle element
if (A[midA] > B[midB]) {
return findKth(A, p1, r1, B, midB+1, r2, k-(midB-p2+1)); //
} else {
return findKth(A, midA+1, r1, B, p2, r2, k-(midA-p1+1)); //
}
} else {
// We don't need to the right-subarray based on the comparisons between middle element.
if (A[midA] > B[midB]) {
return findKth(A, p1, midA-1, B, p2, r2, k);
} else {
return findKth(A, p1, r1, B, p2, midB-1, k);
}
}
}
私が使用した戦略は正しいと感じました。しかし、上に示した2つのテストケースでは、間違った出力がある特定のk番目の値で出力されます。だから私は自分の戦略に何か間違っていると思った。誰がこの実装のどの部分が正しくないか簡単に説明できますか?ありがとう!
あり、それはk番目の最小の要素を取得するための最良の方法の一つであります – Geeky
@Geeky私は、この問題を解決する他の多くの方法があることを知っています。しかし、私はこのアルゴリズムのために間違っていた場所を見つけることができますか? –