无法找到所需的索引

时间:2014-07-02 09:58:33

标签: java algorithm

这是一个面试问题,我被要求修改代码 - >

给定一个排序数组,我必须找到该元素的数组索引(如果它存在),否则我必须返回-1。以下是我的代码:

public static int returnIndex(int[] a, int x) {
    int n = a.length;
    if (n == 0) {
        return -1;
    }
    int l = 0;
    int r = n - 1;
    while (l < r) {
        int m = (l + r) / 2;
        if (a[m] > x) {
            r = m - 1;
        } else {
            l = m;
        }
    }
    if (a[l] == x) {
        return l;
    }
    return -1;
}
如果我必须找到中间元素但是当我必须找到任何其他元素时失败(进入无限循环),

代码工作正常。有谁可以指出错误?

我可以在此代码中仅进行 3次修改。 最坏情况时间复杂度-O(log(n)) 最坏情况Space Complexity-O(1)

2 个答案:

答案 0 :(得分:2)

您正在尝试二进制搜索。所以你需要有3个条件。 midValue&gt; key,midValue&lt; key和midValue == key。您只处理2.当midValue&gt;您需要为索引添加一个键。所以修改你的方法,如

public static int returnIndex(int[] a, int x) {
    int n = a.length;
    if (n == 0) {
        return -1;
    }
    int l = 0;
    int r = n - 1;
    while (l < r) {
        int m = (l + r) / 2;

        if (a[m] > x) {
            r = m - 1;
        } else if(a[m] < x){
            l = m + 1;
        } else {
            return m;
        }
    }
    return -1;
}

如果您没有进行锻炼,可以通过Arrays.binarySearch()方法实现相同的目标。

答案 1 :(得分:0)

我会这样:

    public static int returnIndex(int[] a, int x) {
        int n = a.length;
        if (n == 0) {
            return -1;
        }
        int l = 0;
        int r = n - 1;
        while (l < r) {
            int m = (l + r) / 2;
            if (a[m] == x) {
                return m;
            }
            if (a[m] > x) {
                r = m - 1;
            } else {
                l = m + 1;
            }
        }
        return -1;
    }