class Solution {
public:
bool search(vector<int>& nums, int target) {
int l = 0, r = nums.size() - 1;
while (l <= r) {
int mid = (l+r)/2;
if (nums[mid] == target) {//找到目标值退出
return true;
}
if (nums[l] == nums[mid]) {//关键处理:左端与中点相等。无法判断有序,左边界+1,
//你从哪边去掉重复,这里去掉了左边的重复,就必须优先信任另一边作为有序区间去判断
++l;
} else if (nums[mid] <= nums[r]) {//右半部分有序
if (target > nums[mid] && target <= nums[r]) {//在右半有序区间内
l = mid + 1;
} else {
r = mid - 1;
}
} else {//左半部分有序
if (target >= nums[l] && target < nums[mid]) {//在左半有序区间内
r = mid - 1;
} else {
l = mid + 1;//在右半部分
}
}
}
return false;
}
};