旋转排序数组搜索

时间:2017-03-05 11:16:03

标签: python algorithm binary-search-tree

假设一个已排序的数组在事先未知的某个枢轴处旋转。

(即,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

网上法官告诉我这是错的。但我不这么认为。我的想法是将两个数组附加在一起并进行二分查找。

我错了吗?

2 个答案:

答案 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] 。那么如何找到断点呢?另一个二分搜索!我会把细节留给你。