Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 旋转排序数组搜索_Python_Algorithm_Binary Search Tree - Fatal编程技术网

Python 旋转排序数组搜索

Python 旋转排序数组搜索,python,algorithm,binary-search-tree,Python,Algorithm,Binary Search Tree,假设排序后的数组在您事先不知道的某个轴上旋转 (即,01 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 =

假设排序后的数组在您事先不知道的某个轴上旋转

(即,01 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
def搜索(self,A,B):
初始长度=长度(A)
#arr=[]
#对于我来说,在一个:
#附件(i)
#arr+=arr
i=0
j=2*len(A)-2
而我B:
j=mid-1
其他:
i=mid+1
返回-1
在线法官告诉我这是错误的。但我不这么认为。我的想法是将两个数组附加在一起并进行二进制搜索


我错了吗?

很好地尝试模拟串联,但我认为循环条件
I>>x=[4,5,6,7,0,1,2]
>>>[在范围(9)内搜索(x,i)]
[-1, -1, 6, -1, 0, 1, 2, -1, -1]

您可以找到
i
,这样
a[i]>a[(i+1)%n]
(问题似乎称之为“枢轴”),然后二进制搜索子数组
a[0..i]
a[i+1..n-1]
。那么如何找到断点呢?另一个二进制搜索!我把细节留给你

你能解释一下旋转是什么意思吗?通过连接数组,我可以看出你是从哪里来的,但更简单的方法是找到轴的位置,确定你的值位于数组的哪个部分,然后只使用数组的该部分执行常规的二进制搜索。这是什么语言?在我看来,它像python。要添加到@Matt的评论中,存在一个
binarySearch-eyo(logN)
算法来查找旋转排序数组中的轴。您的总体时间复杂度为
O(logN)
only@AnandUndavia找到枢轴需要o(logn),然后再搜索另一个o(logn),这会得到o(log2n),这与连接数组的复杂性相同?不是吗?我没有显式地进行连接,我只是使用模。
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]