public class BSNearLeft { public static int nearestIndex(int[] arr, int value) { int L = 0; int R = arr.length - 1; int mid = 0; int index = -1; while (L <= R) { //等于R是要把所有的数都测试完 mid = L + ((R - L) >> 1); if (arr[mid] >= value) { index = mid; //如果>=value 标记一个对号 R = mid - 1; } else { L = mid + 1; } } return index; } public static void main(String[] args) { int[] arr = {0,0,0,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4}; int result = nearestIndex(arr,2); System.out.println(result); } }
思路就是二分法,
一直二分到最后一个数如果最后一个数是>=目标值的,此时就是最左的位置
如果最后一个数不是>=目标值就说明上一次记录的index是最左的位置
测试用例运行结果:
找<=某个数最右的位置
public class BSNearRight { public static int nearestIndex(int[] arr,int value){ int L = 0; int R = arr.length - 1; int mid = 0; int index = -1; while (L <= R) { //等于R是要把所有的数都测试完 mid = L + ((R - L) >> 1); if (arr[mid] <= value) { index = mid; //如果>=value 标记一个对号 L = mid + 1; } else { R = mid - 1; } } return index; } public static void main(String[] args) { int[] arr = {0,0,0,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4}; int result = nearestIndex(arr,2); System.out.println(result); } }
同样也是二分,条件相反就可以了
测试用例运行结果:
原文:https://www.cnblogs.com/pxy-1999/p/13259726.html