我遇到了这个面试问题。它说我们必须在排序的数组上进行二进制搜索。以下是代码。此代码有错误,因此它没有给出正确的答案。您必须更改代码才能提供正确的输出。
条件:您不能添加行,并且您只能在代码中更改三行。
int solution(int[] A, int X) {
int N = A.length;
if (N == 0) {
return -1;
}
int l = 0;
int r = N;
while (l < r) {
int m = (l + r) / 2;
if (A[m] > X) {
r = m - 1;
} else {
l = m+1;
}
}
if (A[r] == X) {
return r;
}
return -1;
}
我自己尝试了很多,但在一些测试用例中却遗漏了。
答案 0 :(得分:1)
我讨厌这个问题,这是其中一个&#34;不必要的约束&#34;的问题。正如其他人所提到的,问题在于,如果找到它,你就不会返回该值。由于愚蠢的说明说你不能添加任何代码,你可以像这样破解:
if (A[m] >= X) {
r = m;
} else {
l = m;
}
这会导致性能下降,但它应该有效。
答案 1 :(得分:0)
试试这个:
int l = 0;
int r = N - 1; // changed
while (l <= r) { // changed
答案 2 :(得分:0)
您需要检查循环内的搜索值,如果找到则退出
示例代码:
int solution(int[] A, int X) {
int N = A.length;
if (N == 0) {
return -1;
}
int l = 0;
int r = N;
while (l <= r) { // change here, need to check for the element if l == r
// this is the principal problem of your code
int m = (l + r) / 2;
if (A[m] == X) { // new code, for every loop check if the middle element
return r; // is the search element for early exit.
} else if (A[m] > X) {
r = m - 1;
} else {
l = m + 1;
}
}
return -1;
}
其他问题是,当元素在数组中时,您正在测试更多元素。
答案 3 :(得分:0)
您必须了解所使用的方法。您正在寻找第一个元素&gt; = X。
你希望k与i&lt; k&lt; =&gt; A [i]&lt; X
L代表左派。它是k的下限。你有我&lt; l =&gt; A [i]&lt; X
R代表权利。这是k的上限。你有i&gt; = r =&gt; A [i]> = X。
你的目标是缩小范围并使l = r。为此,请检查中间的值,m =(r + l)/ 2
如果A [m]> = X,则m满足r的条件。你可以设r = m。
如果A [m]&lt; X然后A [m]属于l左边的部分。所以你可以将l设置在m的右边,l = m + 1。
每个循环都会减小l和r之间的范围。当你到达l == r时,你找到了我称之为k的点。 A [k]是最小的数字&gt; = X.您只需要检查它是否是== X或&gt; X
从那里你应该能够修复代码。
PS:注意k(aka l或r)可以是> = A.length。您需要验证。