二分查找属于一看就会一写就错的类型,主要错误来源于对区间的认识不明确,有两种区间划分方法:左闭右闭和左闭右开。
使用条件:
1:数组有序
2:数组中的数字不重复
左闭右闭:
主要是right的取值会发生变化。
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int right=nums.size()-1;
int left=0;
while(left<=right){
int middle=(left+right)/2;
if(nums[middle]>target){
right=middle-1;
}
else if(nums[middle]<target)
left=middle+1;
else if(nums[middle]==target)
return middle;
}
return -1;
}
};
左闭右开:
class Solution {
public:
int search(vector<int>& nums, int target) {
int right=nums.size();
int left=0;
while(left<right){
int middle=(left+right)/2;
if(nums[middle]>target){
right=middle;
}
else if(nums[middle]<target)
left=middle+1;
else if(nums[middle]==target)
return middle;
}
return -1;
}
};