主页有其他数据结构内容(持续更新中)
难度:Medium
代码:
class Solution {
public:
bool search(vector<int>& nums, int target) {
int rightBoundary = nums.size() - 1;
// 恢复二段性,这样才能用二分查找
while(rightBoundary > 0 && nums[rightBoundary] == nums[0]) {
rightBoundary--;
}
int left = -1;
int right = rightBoundary + 1;
// 第一次二分:找出旋转点
while(left + 1 < right) {
int mid = left + (right - left) / 2;
if(nums[mid] >= nums[0]) {
left = mid;
}
else {
right = mid;
}
}
// 判断target在旋转点左边还是右边
if(target >= nums[0]) {
left = -1;
}
else {
right = rightBoundary + 1;
}
// 第二次二分:判断是否存在target并找出下标
while(left + 1 < right) {
int mid = left + (right - left) / 2;
if(nums[mid] <= target) {
left = mid;
}
else {
right = mid;
}
}
if(left <= right && nums[left] == target) {
return true;
}
else {
return false;
}
}
};