题目描述
请实现有重复数字的有序数组的二分查找。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。
示例1
输入
5,4,[1,2,4,4,5]
输出
3
题目思路
看到的一个大神的思路,太强了!!
举例分析
现在有一个100个数的数组,要查找的是56的lower_bound
原始数组数据
三个数lo,right,mid以及a[mid]的变化情况
参考代码
public int upper_bound_ (int n, int v, int[] a) {
// write code here
if (v > a[n - 1]) return n + 1;//最后一个数比v小
int lo = 0, right = n;//设置初始值
while (lo < right) {
int mid = lo + (right - lo) / 2;
if (a[mid] < v) {
lo = mid + 1;
} else right = mid;
}
return lo + 1;
}解法二是正常的二分查找
这个的测试通过率是80%,算法复杂度太高
//write code here
public int upper_bound_ (int n, int v, int[] a) {
if(a[0]>=v)return 1;
int left = 0;
int right = n-1;
int mid = (left + right)/2;
while(left<right){
if(a[mid] >= v){//如果a[mid]>=v,继续判断
if(a[mid-1]<v){//前一位mid-1<v,满足题意
return mid + 1;
}else{//否则就把mid给right,砍掉右边一半
right = mid ;
}
}else{//a[mid]<v,把mid给left,砍掉右边一半
left = mid ;
}
mid = (left + right)/2;
}
return n+1;
京公网安备 11010502036488号