调试二进制搜索代码

时间:2014-09-25 19:43:18

标签: algorithm

我遇到了这个面试问题。它说我们必须在排序的数组上进行二进制搜索。以下是代码。此代码有错误,因此它没有给出正确的答案。您必须更改代码才能提供正确的输出。

条件:您不能添加行,并且您只能在代码中更改三行。

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;
}

我自己尝试了很多,但在一些测试用例中却遗漏了。

4 个答案:

答案 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。您需要验证。