题:假设按照升序排序的数组在预先未知的某个点进行了旋转,给定一个目标值,如果数组中存在这个目标值,返回它的索引,否则返回-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