//查找 大于target值的最小元素
public static <E extends Comparable<E>> int searchBigForTarget(E[] array, E target) {
//r取值大于索引最大值,这样就可以取到超过索引值,即表示不存在大于target值
int l = 0, r = array.length;
//循环不变量 [l,r]范围查找解
//l < r 而不是 l <= r,因为 在[l,r]范围肯定能找到解
while (l < r) {
int mid = l + (r - l) / 2;
if (array[mid].compareTo(target) <= 0)
l = mid + 1;
else
r = mid;
}
return l;
}
public static void main(String[] args) {
Integer[] arr = ArraysUntils.generatorOrderArray(5);
System.out.println(Arrays.toString(arr));
int sort = searchBigForTarget(arr,2);
System.out.println(Arrays.toString(arr));
System.out.println(sort);
}
//查找 >target值的最小值索引, = target的最大索引
public static <E extends Comparable<E>> int searchLowCeil(E[] array, E target) {
int bigForIndex = searchBigForTarget(array, target);
if (bigForIndex - 1 >= 0 && array[bigForIndex - 1].compareTo(target) == 0) {
return bigForIndex -1;
}
return bigForIndex;
}
结果:
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
3