在一个有序数组中,找>=某个数最左的位置和<=的最右的位置
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); } }
同样也是二分,条件相反就可以了
测试用例运行结果:
学习的博客多用于在笔记中,防止笔记过于臃肿,所以将样例及运行结果放在博客中,后以超链接的形式记录在笔记中,所以有些博文过于单薄。如果有小伙伴遇到问题欢迎评论,看到就会回复,学渣一枚,加油努力。