思路:
- 1,判断mid的位置,位于单调升,还是左边截断,还是右边截断。
- 2,针对不同mid的位置,来二分,有些情况需要左右同时二分。
一些二分的心得:
谨慎处理nums[mid] = key的情况,
如果返回二分左边界,则=和<的情况可以合并,例如nums[mid]<=key
如果返回二分右边界,则=和>的情况可以合并,例如nums[mid]>=key
/*
* @lc app=leetcode id=33 lang=cpp
*
* [33] Search in Rotated Sorted Array
*/
// @lc code=start
class Solution {
public:
int search(vector<int>& nums, int target) {
return bisearch(nums,0,nums.size(),target);
}
int bisearch(vector<int>& nums,int L,int R,int key){
if(L+1 >= R){
if(nums[L] == key) return L;
return -1;
}
int mid = (L+R)/2;
if(nums[L] < nums[mid] && nums[mid] < nums[R-1]){
if(nums[mid] <= key){
return bisearch(nums,mid,R,key);
}
return bisearch(nums,L,mid,key);
}
if(nums[L] < nums[mid] && nums[mid] > nums[R-1]){
if(nums[mid] < key){
return bisearch(nums,mid,R,key);
}
int t = bisearch(nums,L,mid,key);
if(t == -1){
return bisearch(nums,mid,R,key);
}
return t;
}
if(nums[mid] > key){
return bisearch(nums,L,mid,key);
}
int t = bisearch(nums,mid,R,key);
if(t == -1){
return bisearch(nums,L,mid,key);
}
return t;
}
};
// @lc code=end