二分法的错误原因一般在区间定义上
左闭右闭区间
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0;
int r = nums.size()-1; //左闭右闭要求取到右区间端点
while(l <= r){ //左闭右闭代表只有一个元素时可以相等,要包含这种情况
int mid = l + (r-l)/2; //防止溢出
if(nums[mid]==target) return mid;
else if(nums[mid]>target) r = mid-1; //区间端点可以取到代表nums[mid]值已经确定,右区间端点移动
else l = mid+1; //同理
}
return -1;
}
};
左闭右开区间
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0;
int r = nums.size(); //左闭右开要求不取到右区间端点
while(l < r){
int mid = l + (r-l)/2; //防止溢出
if(nums[mid]==target) return mid;
else if(nums[mid]>target) r = mid;
else l = mid+1;
}
return -1;
}
};