81. 搜索旋转排序数组 II
题目描述
思路分析
二分
预处理下最后的边界。然后二分出分界点,确定
t
a
r
g
e
t
target
target可能在哪一段上,然后再缩小范围二分找
t
a
r
g
e
t
target
target。
代码实现
class Solution {
public:
bool search(vector<int>& nums, int target) {
if(nums.empty()) return false;
int last=nums.size()-1;
while(last>=0&&nums[last]==nums[0]) last--;
if(last<0) return nums[0]==target;
int l=0,r=last;
while(l<r){
int mid=l+r+1>>1;
if(nums[mid]>=nums[0]) l=mid;
else r=mid-1;
}
if(target>=nums[0]) r=l,l=0;
else l++,r=last;
while(l<r){
int mid=l+r>>1;
if(nums[mid]>=target) r=mid;
else l=mid+1;
}
return nums[r]==target;
}
};