代码之家  ›  专栏  ›  技术社区  ›  McLovin

在k排序数组中查找k

  •  1
  • McLovin  · 技术社区  · 7 年前

    我正在尝试编写一个类似于二进制搜索的算法,以在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 回复  |  直到 7 年前
        1
  •  1
  •   maraca    7 年前

    您需要找到第一个小于[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值。