思路:
- 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
旋转有序数组搜索
本文介绍了一种在旋转有序数组中查找特定元素的二分搜索算法。详细解释了如何判断中间元素(mid)的位置,并据此进行有效的二分搜索。文章强调了在处理nums[mid]=key情况时的注意事项,以及在不同条件下如何正确地进行左右二分。

被折叠的 条评论
为什么被折叠?



