很简单很基础
第一种
我们最先就判断能否直接命中target
保证了后面的判断中target不可能被漏掉 因为mid不可能是target
class Solution(object):
def findMin(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
l, r = 0, len(nums) - 1
while l <= r:
mid = l + ((r - l) >> 1)
if nums[mid] < nums[mid - 1]: # 数组中唯一一个逆序 序列 找到之后直接返回 数组越界问题? 假设只有一个元素 nums[0] < nums[-1] 此时 nums[-1]合法 表示最后一个元素
return nums[mid]
elif nums[mid] < nums[l]: # mid 位于右段 target位于左段
r = mid - 1
elif nums[mid] > nums[r]: # mid 位于左段 target位于右段
l = mid + 1
else: # 处理只有一个元素的情况 [1]
return nums[l]
第二种
def search(self, nums, target):
# 先去找到旋转数组的最小元素的下标
left, right = 0, len(nums) - 1
while left < right: # 思想是一定要等到区间缩小到1 不区判断mid是否可以直接命中
mid = (left + right) // 2
if nums[mid] > nums[right]: # mid 位于左段 target必然在右段
left = mid + 1
else: # mid位于右段 target位于左段
right = mid # 一定不能是mid - 1 因为target本身就在右段上面 我们得保证不漏掉target
return left # 此时 mid == left == right
网友评论