打卡题目:leetcode第33题,搜索旋转排序数组
相似题目:81、153
【思路】
- 暴力解法:for循环遍历,找到目标值。
- 二分查找特殊变形。必须理解到:不管怎么旋转,总有一部分区间是有序的。比如,1->mid和mid->r之中至少有一个是有序的。我们的逻辑就是:判断target是否在有序区间中,在则将另一个指针移动到有序区间内,否则将有序区间的指针(除mid外的另一个边界指针)移动到有序区间外。
【代码】
class Solution:def search(self, nums: List[int], target: int) -> int:if not nums:return -1l, r = 0, len(nums)-1while l <= r:mid = l + (r - l) // 2if nums[mid] == target:return midif nums[l] <= nums[mid]:if nums[l] <= target < nums[mid]:r = mid - 1else:l = mid + 1else:if nums[mid] < target <= nums[r]:l = mid + 1else:r = mid - 1return -1
