int l=1,r=len;
while(l<=r){
int mid=(l+r)/2;
if(d[mid]>=k) r=mid-1;
else{
l=mid+1;
pos=mid;
}
}
return pos
我的理解是:
每当mid所指向的值>=k ,那么mid及右边的可以不考虑,r=mid-1
当mid所指向的值<k ,则mid所指向的值是有可能作为最后的答案的,我们先用pos指向mid,然后l=mid+1;
这里的l=mid+1困惑了我挺久,我写l=mid就不对吗?
还真不对,会产生死循环,我们来看一个例子:
比如我的k是3,那么现在mid所指向的是2,如果我们l=mid,则这个while循环会一直下去,造成所谓的死循环!
我们的解决方案是,每当l移动时,我们用pos指向一个可能作为答案的下标,现在l、r都指向3,然后mid指向3,于是r指向2,循环结束!