9.二分查找
题目描述
请实现有重复数字的升序数组的二分查找。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数(指不存在大于等于查找值的数),则输出数组长度加一。
输入
5,4,[1,2,4,4,5]
返回值
3
说明
输出位置是从1开始算的
分析
1.主要算法思想为二分查找思想,也就是折半查找思想。
2.本题目的主要难度在于对题目的题意理解,n是数组的长度,v是查找的目标,a是目标数组
3.首先我们要明确一点,二分查找只适用于有序的数组中,其次在进行对题目本身的操作
4.确定一个中间位置,然后与目标值v进行比较,在重复此操作即可
代码实现
public int upper_bound_ (int n, int v, int[] a) {
int i=0;
int j=n-1;
int mid = (i+j)/2;
while(i<=j) {
if(a[mid]<v) {
i=mid+1;
mid = (i+j)/2;
}
else if(mid>0&&a[mid-1]>=v) {
j=mid-1;
mid=(i+j)/2;
}else{
return mid+1;
}
}
return n+1;
}
}