二分的思想很简单,但是落实到代码上,尤其是边界的处理,就没有那么容易了,这里做一个记录。
根据二分思想,可以很容易想到的代码:
int Find(vector<int> &numbers,int Target){//二分程序,返回序号
int l=0;
int r=numbers.size()-1;
while(r!=l){
int now=(l+r)/2;
if(numbers[now]==Target){
return now;
}
if(numbers[now]>Target){
r=now;
}
else{
l=now;
}
}
if (numbers[l]==Target){
return l;
}
else{
return -1;
}
}
这种写法会导致死循环,死循环的原因就在于边界条件过于严格,在输入数据[2,3,4],所找目标为4时,l为1,r为2,now会一直为1,这三个值不会变,也就会一直循环下去。
解决的方法也很简单,略微放宽边界条件就可以了
int Find(vector<int> &numbers,int Target){//二分程序,返回序号
int l=0;
int r=numbers.size()-1;
while(l<=r){
int now=(l+r)/2;
if(numbers[now]<Target){
l=now+1;
}
else if(numbers[now]>Target){
r=now-1;
}
else{
return now;
}
}
return -1;
}