
这道题的思路是以中间为界限,左右两边一定有一边是有序的。将target与有序区间的边界比较大小,能够判断target在数组的哪一边。从而进行区间缩小。二分查找的本质是排除法,有序可以让我们对区间进行排除。
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size() == 0) return -1;
int left = 0;
int right = nums.size() - 1;
while(left < right){
int mid = left + (right - left + 1) / 2; // 将mid算作右半区间进行考虑
if(nums[mid] < nums[right]){ //右半区间[mid, right]有序
if(target >= nums[mid] && target <= nums[right]) { //target在有序数组中
left = mid; // 下一轮搜索区间为[mid, right]
}else {
right = mid - 1; //下一轮搜索区间为[left, mid - 1]
}
}else { //左半区间[left, mid - 1]有序
if(target >= nums[left] && target <= nums[mid - 1]) { //target在有序数组中
right = mid - 1; // 下一轮搜索区间为[left, mid - 1]
} else{
left = mid; // 下一轮搜索区间为[mid, right]
}
}
}
if(nums[left] == target){
return left;
}else {
return -1;
}
}
};