🧩Algo 二分查找
33. 搜索旋转排序数组
难度:🟡 Medium | 标签:二分查找 | 状态:⬜ LeetCode 链接
思路
判断 mid 在哪一半有序,再判 target 是否在该半。
nums[l] <= nums[m]→ 左半有序- 否则右半有序
代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0, r = nums.size() - 1;
while (l <= r) {
int m = l + (r - l) / 2;
if (nums[m] == target) return m;
if (nums[l] <= nums[m]) { // 左半有序
if (nums[l] <= target && target < nums[m]) r = m - 1;
else l = m + 1;
} else { // 右半有序
if (nums[m] < target && target <= nums[r]) l = m + 1;
else r = m - 1;
}
}
return -1;
}
};
复杂度
- 时间 O(log n),空间 O(1)
易错 / 回顾
nums[l] <= nums[m]含等号(处理 l == m 的边界)- 内部区间判断用闭区间
<= target && target <,写错位 WA - 含重复值版本(81)要处理
nums[l] == nums[m]的退化
Related · 二分查找