在k排序的数组中找到k

时间:2018-03-17 18:01:24

标签: algorithm

我试图编写类似二进制搜索的算法来在k排序的数组中找到k。 (它需要是O(logn))

例如,k这里是3: 5, 6, 7, 1, 2, 3, 4

这是我在Java中的尝试

public static int findk(int[] a) {
    int low = 0;
    int high = a.length-1;

    while(low <= high) {
        if(a[low] <= a[high])
            return low;

        int middle = (low+high)/2;
        if(a[low] > a[middle])
            high = middle-1;
        else
            low = middle+1;
    }

    return 0;
}

它适用于某些输入但不适用于其他输入。它应该很容易,但我无法弄清楚错误。

即使是暗示也会很好!

1 个答案:

答案 0 :(得分:1)

您需要找到小于[0]的第一个元素。所以你需要与[0]进行比较。

public static int findk(int[] a) {
    int low = 0;
    int high = a.length - 1;
    if (a[high] >= a[0]) // special case array completely sorted
        return high + 1;
    while(low < high) {
        int middle = (low + high) / 2;
        if(a[middle] < a[0])
            high = middle;
        else
            low = middle + 1;
    }    
    return low; // or high
}

你将在开始时获得[0,6],然后是[0,3],然后是[2,3],最后是[3,3]。

我们不做high = middle - 1的原因是,这样我们最终可能会得到我们不想要的k值。