Search in Rotated Sorted Array

来源:互联网 发布:python中的迭代器 编辑:程序博客网 时间:2024/05/16 00:30

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

Subscribe to see which companies asked this question


解答:这个问题想说明的是,二分查找的有关问题。二分查找适用范围:要在一个“有序”的数组上查找,其中平均and最坏时间复杂度都是O(logN)。本题想说明的是,其实二分查找也可以在有序数组的“旋转”上面使用。只不过多了一步判断哪边是有序【没被旋转破坏】的,即可。

Python代码

class Solution(object):    def search(self, a, target):        """        :type nums: List[int]        :type target: int        :rtype: int        """        left,right=0,len(a)-1        while left<=right:            mid=left+(right-left)/2            if a[mid]==target:                return mid            if a[left]<=a[mid]:                #说明左边已经排序好                if a[left]<=target and target<a[mid]:                    right=mid-1                else:                    left=mid+1            else:                #说明右边已经排序好                if a[mid]<target and target<=a[right]:                    left=mid+1                else:                    right=mid-1        return -1            
代码说明:在第13行的时候,我犯了一个错误。

          if a[left]<=a[mid]:                #说明左边已经排序好

在判断哪边排序好的时候,我没有把=放进去,只是一个单纯的小于。然后,程序就报错了。在输入[1,3],1的时候,我无法查找到1。【虽然不知道玄机在哪里,但是我加了个等于,程序就通过了】希望各位小伙伴们指点。

另外,总结出的规律:在前面while这里,有两种表示方法,一种是

        while left<=right:
在这种情况下,左边left和右边right的更新都可以减一更新,即left=mid+1,right=mid-1

如果是

 while left<right:
那么,左边left和右边right就只能等于mid这样更新了。即left=mid,right=mid。否则会出现没有考虑完全的情形,进入死循环。大家切记。


0 0
原创粉丝点击