这题思路清晰,先用2分查找找出最小的点,然后分区间进行一次2分就ok了
Ps!!!复习2分的各种细节,虽然很简单!!!!!
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
if(n == 1 && nums[0] == target) return 0;
else if(n == 1) return -1;
int r, l;
r = 0; l = n - 1;
while(l - r > 1){
int mid = (r + l) / 2;
if(nums[mid] < nums[n - 1]) l = mid;
else r = mid;
}
if(nums[r] < nums[l]){
r = 0; l = n - 1;
}
else if(target > nums[n - 1]){
r = 0; l = l - 1;
}
else{
r = r + 1; l = n - 1;
}
while(r < l){
int mid = (r + l) / 2;
if(nums[mid] == target) return mid;
if(nums[mid] > target) l = mid;
else r = mid + 1;
}
if(nums[l] == target) return l;
return -1;
}
};