请实现有重复数字的有序数组的二分查找。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加1。
第一行两个正整数n,v(1<=n<=100000,1<=v<=100000),分别表示数组长度与查找值。
第二行n个正整数a1,a2,...,an(1<=a1<=a2<=...<=an<=n)表示有序数组。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。
5 4 1 2 4 4 5
3
5 4 1 2 3 3 5
5
5 4 1 2 2 3 3
6
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); // 输入 while (input.hasNextInt()) { int length = input.nextInt(); // 输入数组长度 int value = input.nextInt(); // 输入查询值 int array[] = new int[length]; for (int i = 0; i < length; i++) { array[i] = input.nextInt(); // 输入数组元素值 } int low = 0; // 设置边界左端位置 int high = length - 1; // 设置边界右端位置 while (low <= high) { if (array[(low + high) / 2] < value) { // 若此段中间位置值小于查询值 low = (low + high) / 2 + 1; // 说明查询值位于此段右半段 } if (array[(low + high) / 2] >= value) { // 若此段中间位置值大于等于查询值 high = (low + high) / 2 - 1; // 说明查询值位于此段右半段 } } if (low == length || high == -1) { if (high == length - 1 && array[high] >= value) { System.out.println(high + 1); } else if (low == 0 && array[low] >= value) { System.out.println(low + 1); } else { // 说明查询值并不位于此数组中 System.out.println(length + 1); } } else { if (array[low] >= value && array[high] >= value) { System.out.println(high + 1); } if (array[low] >= value && array[high] < value) { System.out.println(low + 1); } } } } }