假设一个已排序的数组在事先未知的某个枢轴处旋转。
(即,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2)。
您将获得要搜索的目标值。如果在数组中找到,则返回其索引,否则返回-1。
您可以假设数组中不存在重复。
我的解决方案:
def search(self, A, B):
origLength = len(A)
# arr = []
# for i in A:
# arr.append(i)
# arr += arr
i = 0
j = 2 * len(A) - 2
while i <= j:
mid = (i + j) / 2
if A[(mid % origLength)] == B:
return mid % origLength
elif A[mid % origLength] > B:
j = mid - 1
else:
i = mid + 1
return -1
网上法官告诉我这是错的。但我不这么认为。我的想法是将两个数组附加在一起并进行二分查找。
我错了吗?
答案 0 :(得分:0)
很好尝试模拟连接,但我认为循环条件i <= j
不再足够。
我认为找不到支点没有解决办法,因此这次尝试注定要失败。
查找枢轴均值找到可能旋转的有序数组中的最小元素,就像@Matt注释掉一样。
我使用下面的代码,带有一个测试用例,清楚地表明它不起作用。
def search(A, B):
origLength = len(A)
i = 0
j = 2 * len(A) - 2
while i <= j:
mid = (i + j) / 2
if A[(mid % origLength)] == B:
return mid % origLength
elif A[mid % origLength] > B:
j = mid - 1
else:
i = mid + 1
return -1
>>> x = [4, 5, 6, 7, 0, 1, 2]
>>> [search(x,i) for i in range(9)]
[-1, -1, 6, -1, 0, 1, 2, -1, -1]
答案 1 :(得分:0)
您可以找到i
a[i] > a[(i+1) % n]
(问题似乎是“枢轴”),然后二分搜索子阵列a[0..i]
和a[i+1..n-1]
。那么如何找到断点呢?另一个二分搜索!我会把细节留给你。