题目描述
请实现有重复数字的有序数组的二分查找。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。
示例1
输入
复制
5,4,[1,2,4,4,5]
输出
复制
3
题解:
注意结束条件是left <= right,应为mid计算是下取整,如果用 left < right 的话有可能无法访问到right
package com.wx.nowcoder;
public class NC105 {
public static int upper_bound_(int n, int v, int[] a) {
if (a[n - 1] < v) return n + 1;
return getRes(a, 0, n - 1, v);
}
private static int getRes(int[] arr, int i, int j, int v) {
int left = i;
int right = j;
int mid = -1;
int res = 0;
while (left <= right) {
mid = (left + right) / 2;
if (arr[mid] < v) {
left = mid + 1;
} else {
res = mid;
right = mid - 1;
}
}
return res + 1;
}
public static void main(String[] args) {
int[] arr = {1, 2, 4, 4, 5};
int i = upper_bound_(arr.length, 4, arr);
System.out.println(i);
}
}