题目
搜索旋转排序数组
思路
此题是很明显的二分法求确切值,思考方法跟求边界值略有不同,首先可以确定循环条件为,因为既然是求明确值,那么肯定是和的闭区间(和的值也被包含进去),然后再确定左右边界的移动方式,假定当前不符合(右移),此时可能符合条件的区间应(需要将排除在外,因为已经不符合了),同理当不符合(左移)也是一样,此时符合区间应为
再回归到此题,此题的不同之处是,将原本有序的序列进行了旋转,变为了两个有序的序列,乍看起来不太好做,实际上一分析,做法还是相同,只要根据条件判断每一次右移和左移的条件就行了。
代码
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums) - 1
lv = nums[0]
while left <= right:
mid = (left+right)//2
t = nums[mid]
if t == target:
return mid
if target >= lv: # 左半边
if nums[left] <= t < target: # 右移
left = mid + 1
else:
right = mid - 1
else: # 右半边
if nums[right] >= t > target: # 左移
right = mid - 1
else:
left = mid + 1
return -1