int find(int b, int e,int value)
1.在数组num的下标范围b,e,查找num[i]<= value 的最大i
int findpm(int b,int e,int value){
int id = b-1;//Attention
int mid;
while(b<=e){ //ATTENTION <=
mid = (b+e)>>1;
if(num[mid]<=value){
id = mid;
b = mid+1;
}else{
e = mid-1;
}
}
return id;
}
关键部分在于
if(num[mid]<=value){
id = mid;
b = mid+1;
while(b<=e)的终止条件要有=,因为id标记的是num[mid]<=value的mid,随着mid的往右不断移动来得到满足条件的id,考虑这个情况:
num[b]=value, j>b时,num[j]>num[b], 如果 while(b<e)来终结的话,在循环中num[mid]一直大于value,直到b==e终止,返回id = b-1.显然错啦。
用while(b<=e)来终止的话,循环到b==e时,
mid = (b+e)>>1
=> mid == b
=> num[mid]==value
=> id = mid
=> b = mid+1;
=> b>e
终止循环,返回id = b;
这样的程序对于不同情况的结果
1)value < num[b]
也就是num数组从b到e范围内不存在<=value的元素,返回b-1;
2) num数组从b到e范围内存在多个比value小的元素,不存在等于value的元素
返回比value小的最大的num[id]
3) num数组从b到e范围内存在多个等于value的元素
返回等于value的最大的num[id]