我试图编写类似二进制搜索的算法来在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;
}
它适用于某些输入但不适用于其他输入。它应该很容易,但我无法弄清楚错误。
即使是暗示也会很好!
答案 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值。