已知一个升序数组arr,和一个整数num,找出大于等于num的数的最小索引。即最左的索引。
import java.util.Arrays;
/**
* 已知一个升序数组arr,和一个整数num,找出大于等于num的数的最小索引。即最左的索引。
*/
public class Code02_BSNearLeft {
public static int mostLeftNoLessIndex(int[] arr, int num) {
int L = 0;
int R = arr.length - 1;
int t = -1;
while (L <= R) {
int mid = L + ((R - L) >> 1);//防止溢出。
//注意,位移的这一层括号一定要加上,否则会先算加法,导致结果错误!
//即"位运算符"和"加减乘除"的优先级一样,谁在前就先使用谁。
// int mid = (L + R) / 2;
if (arr[mid] >= num) {
t = mid;//更新t的索引位置
R = mid - 1;//更新R的位置。砍掉mid(含)的右边,R来到mid-1位置。
} else {
L = mid + 1;//更新L的位置。砍掉mid(含)的左边,L来到mid+1位置。
}
}
return t;
}
public static int test(int[] arr, int num) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] >= num) {
return i;
}
}
return -1;
}
public static int[] generateRandomLenAndRandomValue(int maxLen, int maxValue) {
int[] arr = new int[(int) (Math.random() * maxLen)];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * (maxValue + 1)) - (int) (Math.random() * maxValue);
}
return arr;
}
public static void printArr(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int testTimes = 10000;
int maxLen = 10;
int maxValue = 100;
boolean succeed = true;
for (int i = 0; i < testTimes; i++) {
int[] arr = generateRandomLenAndRandomValue(maxLen, maxValue);
Arrays.sort(arr);
int num = (int) (Math.random() * (maxValue + 1)) - (int) (Math.random() * maxValue);
if (test(arr, num) != mostLeftNoLessIndex(arr, num)) {
System.out.println(num);
printArr(arr);
System.out.println(test(arr, num));
System.out.println(mostLeftNoLessIndex(arr, num));
succeed = false;
break;
}
}
System.out.println(succeed ? "ok!" : "fucking fucked!");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具