我有一个数组(线性字段) 预先排序的数字
[1, 2, 3, 4, 5, 6],
但是这些arra y向右移动(k次),
现在它的
[5,6,1,2,3,4], k = 2
但我不知道k。只有阵列A。
现在我需要一个算法来查找A中的最大值(使用运行时O(logn))
我认为它有二分搜索功能,任何人都可以帮助我吗?
答案 0 :(得分:2)
可以通过找到“不连续点”,即数组中6, 1
点的索引来重新说明这个问题。您可以使用类似于binary search的方法迭代地执行此操作,如下所示:
获取数组A
和两个索引low
和high
,最初设置为0
和A.Length-1
。不连续点位于low
和high
之间。
将(low, high)
分成两半。调用中点mid
。将A[low]
与A[mid]
和A[mid]
与A[high]
进行比较。如果只有一对正确排序,请调整端点:如果它是订购的low-mid
对,请指定low = mid
,否则指定high = mid
。如果两个区间都是有序的,答案是A[high]
。
这在O(LogN)
中运行,因为每个步骤都会将问题的大小减少一半。
答案 1 :(得分:1)
你是对的,它基本上是二元搜索。
选择中间数字。如果它小于(当前分区的)左端的数字,那么最大的数字在左分区中。否则,它在正确的分区中。
答案 2 :(得分:0)
如果你知道'k'是什么,那么你可以拆分数组并重建它,或者你可以重新实现一个偏移k的二进制搜索算法。
例如,
int low = 0;
int high = array.length - 1;
while(low != high)
{
int test = (low + high)/2;
int testIndex = (test + k) % array.length;
if (array[testIndex] < wanted)
low = test;
else if (array[testIndex] > wanted)
high = test;
else
return testIndex;
}
或类似的东西。 testIndex变量偏移'k',但搜索索引(低,高和测试)不知道。
PS。,您需要为此代码添加更多安全检查(例如,'想要'不在数组中);我只是想显示索引偏移部分。