33.搜索旋转排序数组--python

题:假设按照升序排序的数组在预先未知的某个点进行了旋转,给定一个目标值,如果数组中存在这个目标值,返回它的索引,否则返回-1,数组中不存在重复元素

法:这题木有重复元素,所以不存在nums[mid]既等于nums[left]又等于nums[right]的情况。数组在某个位置进行旋转,那么整个数组分成了两个递增的数组,比如nums=[4,5,6,7,0,1,2],前后数组都是单调增的。根据nums[mid]与nums[right]的大小情况,可以进一步缩小左右边界

思想很简单,但写起来有很多需要注意的细节

1)大循环条件,while left<=right,注意有等号,因为如果nums=[1]的时候,会预先设置左右边界都为0,如果不加等号,连大循环都进不去

2)每次target与边界nums[right],nums[left]比较的时候,都要加等号

3) 代码处,target与nums[right]比较的时候,不能加等于,否则nums=[4,5,6,7,0,1,2,3],target=3时会超时

def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        
        length=len(nums)
        if length==0:return -1
        left,right=0,length-1
        while left<=right:
            mid=left+(right-left)//2
            if nums[mid]==target:return mid
            if nums[mid]<nums[right]:#这里不能加等于
                if target<=nums[right] and nums[mid]<target:
                    left=mid+1
                else:right=mid
            else:
                if target>=nums[left] and nums[mid] > target:
                    right=mid
                else:left=mid+1
        return -1
发布了56 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/karen17/article/details/88945252
今日推荐