二分查找法的两种写法
nums = [-1,0,3,5,9,12],target = 9;
- 左闭右闭写法:
target在[left, right]区间里面,当写循环while时,循环条件为left<=right,因为当left=right时的这个值是有效的,target可能会等于这个值。初始时,左区间定义为0,右区间定义为length-1(因为右边也是闭的)。 又因为它们都是闭区间,所以更新条件的时候,不能再把mid算进去了,否则容易在多算一边的mid(前一次已经算过了mid),即left=mid+1,right=mid-1。这样做是因为初始的right影响了mid,如果更新right时出错,就会增加查找次数。
int search(vector<int>& nums, int target) {
int length=nums.size();
int left=0,right=length-1;
while(left<=right){
int mid=left+(right-left)/2;
if(target<nums[mid]){
right=mid-1;
}else if(target>nums[mid]){
left=mid+1;
}else{
return mid; }
}
return -1;
}
- 左闭右开
target在[left, right)区间里面,这时候没有把right算进来了,所以初始化的时候right=length,前面右闭的时候会把right算进去这里没有,所以更新right的时候令它等于mid。
int search(vector<int>& nums, int target) {
int length=nums.size()-1;
int left=0,right=length;
while(left<right){
int mid=left+(right-left)/2;
if(target<nums[mid]){
right=mid;
}else if(target>nums[mid]){
left=mid+1;
}else{
return mid;
}
}
return -1;
}