将有序数组切开[A、B]
变成 [B、A]
(A、B内部有序),仍然可以用二分来搜索,只是判断条件变复杂了一点。
mid
的位置有两种可能:在切线的左边\右边。
根据mid
与l
值与target
的关系,选取左右分区。
二分模板:mid
下取整,l = mid+1
;mid/2.0
向上取整,r = mid-1
。
注意:else
的部分包含等于的情况,若单独判断时,等号的情况要考虑进去。
附上代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0, r = nums.size()-1;
int out = -1;
while(l < r){
int mid = (l+r)/2;
if(nums[l] < nums[r]){
if(nums[mid] < target) l = mid+1;
else r = mid;
continue;
}
if(nums[l] > nums[mid]){
if(nums[mid] < target && nums[l] > target) l = mid+1;
else r = mid;
} else if(nums[l] < nums[mid]){
if(nums[mid] >= target && nums[l] <= target) r = mid;
else l = mid+1;
}else{
if(nums[mid] > target) l = mid+1;
else r = mid;
}
}
if(l == r && nums[r] == target) return l;
return -1;
}
};