81. 搜索旋转排序数组 II
思路:二分法,肯定能分到有序的一半和无序的一半,如果不在有序的一半那就在无序的那一半里面
问题在于对于有序的一半的判断
一开始想当然的,nums[left]<=mid就是在左半边,否则再右半边,但是这个等号是最难辨别的
因为如果mid是中间的话最难分辨了
- 1,3,1,1,1,1
- 1,1,1,1,3,1
都是不能分辨出来的,
因此应该单独拿出来分析,采用缩短区间的方式慢慢的搞了只能
class Solution {
public:
bool search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int mid = (left + right) / 2;
while (left <= right) {
mid = (left + right) / 2;
if (nums[mid] == target) {
return true;
}
//先找到有序的一半 [left,mid)
//不能写等号,因为添加了等号会出现1,3,1,1,1,1这种情况
//但是不写等号也可能出现 1,1,1,1,3,1额
if (nums[left] < nums[mid]) {
//左半边肯定有序 [left,mid)
if (target >= nums[left] && target < nums[mid]) {
//在左半边
right = mid - 1;
}
else {
left = mid + 1;
}
}
else if (nums[right] > nums[mid]) {
//右半边肯定有序
if (target > nums[mid] && target <= nums[right]) {
//那就右半边
left = mid + 1;
}
else {
right = mid - 1;
}
}
else {
//无法区分,缩一个空间
if (nums[left] == target) return true;
else left++;
}
}
return false;
}
};