class Solution:
def minNumberInRotateArray(self, rotateArray):
if not rotateArray:
return 0
left = 0
right = len(rotateArray) - 1
while left < right:
mid = (left + right)//2
if rotateArray[mid] > rotateArray[right]:
left = mid + 1
elif rotateArray[mid] < rotateArray[right]:
right = mid
else:
right -= 1
return rotateArray[right]
旋转数组寻找target
这道题和上道题的明显区别是,没有重复!
其实只需要理解为范围的收缩,不用管是否找到,因为一旦相等就会找到,我们需要做的是把范围正确的收缩!!!!!
遇到这种左右的逻辑题,千万不要紧张。接下来特训一下关于二分的场景题目。
解法一:先分开是左数组还是右数组
存在重复的旋转数组寻找最左边的target
精髓就是正确缩小范围就行了
def find(nums, tar):
left = 0
right = len(nums) - 1
if nums[0] == tar:
return 0
while left <= right:
mid = (left + right) // 2
if nums[mid] > tar:
if tar > nums[-1]:
right = mid - 1
elif tar < nums[-1]:
if nums[mid] <= nums[-1]: # 其实当时面试就差这么一句话就可以了!!!!
right = mid - 1
else:
left = mid + 1
else:
m = len(nums)-1 # 如果跟最后一个相等,那么可以往前推,不用担心在第一个,WHILE前已经解决~
while nums[m] == nums[-1]:
m -= 1
return m+1
elif nums[mid] < tar:
left = mid + 1
else:
if nums[mid-1] == tar:
right -= 1 # 只管正确缩小范围就行了
else:
return mid