33. 搜索旋转排序数组
题目
方法思路
- 二分法
- 先找到一段有序的(可能左边,可能右边,或者两边都有序)
- 然后判断target在不在这段有序数组范围之中
- 在其中,就二分该段数组
- 不在,就二分另一段数组
代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int ans = -1;
int l = 0;
int r = nums.size() - 1;
if (target > nums[r] && target < nums[l]) return ans;
while (l <= r) {
int mid = l + ((r - l) >> 1);
if (nums[mid] == target) {
ans = mid;
break;
}
// 如果左边有序
if (nums[l] <= nums[mid]) {
// 如果target在[l, mid),二分[l, mid)
// 不在就二分(mid, r]
if (target >= nums[l] && target < nums[mid]) {
r = mid - 1;
} else {
l = mid + 1;
}
// 如果右边有序
} else {
// 如果target在(mid, r],二分(mid, r]
// 不在就二分[l, mid)
if (target > nums[mid] && target <= nums[r]) {
l = mid + 1;
} else {
r = mid - 1;
}
}
}
return ans;
}
};
题解:题解