题目描述
请实现有重复数字的有序数组的二分查找。输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。
解:
这道题考察的其实是变换了终止条件的二分查找,所以在条件上要是第一个>=value的值才满足,而且要注意边界。详见代码:
import java.util.*;
public class Solution {
/**
* 二分查找
* @param n int整型 数组长度
* @param v int整型 查找值
* @param a int整型一维数组 有序数组
* @return int整型
*/
public int upper_bound_ (int n, int v, int[] a) {
if(n==0)
return 1;
int s=0,e=n-1;
int index;
while(s!=e){
index=(s+e)/2;
if(a[index]>=v){
if(index==0 || (index>0 && a[index-1]<v)){
//返回值不是数组下标,而是排位
return index+1;
}else{
e=index;
}
}else{
//这个位置会导致index+1=e,然后直接跳出循环
//即,最后一个可能满足的值还没有判断
s=index+1;
}
}
if(a[s]>=v){
//返回值不是数组下标,而是排位
return s+1;
}else{
return (n+1);
}
}
}