package Code01;
import java.util.Arrays;
public class Solution {
// arr有序 二分法 查找数组中是否存在num
public static boolean find(int[] arr, int num){
// 对数组进行预判断
if(arr==null || arr.length==0){
return false;
}
int L = 0;
int R = arr.length-1;
while(L <= R){
int mid = (L+R)/2;
if(arr[mid] == num){
return true;
}
else if(arr[mid] < num){
L = mid +1;
}
else {
R = mid-1;
}
}
return false;
}
// 找到大于等于num中最左的位置
public static int mostLeftNoLessNumIndex(int[] arr, int num){
if( arr==null || arr.length==0){
return -1;
}
int ans = -1;
int L =0;
int R = arr.length-1;
while(L<=R){
int mid = (L+R)/2;
if (arr[mid] >= num) {
R = mid -1;
ans = mid;
}
else if (arr[mid] < num) {
L = mid+1;
}
}
return ans;
}
public static boolean test(int[] sortedArr, int num){
for(int cur : sortedArr){
if(cur == num){
return true;
}
}
return false;
}
public static int[] generateRandomArray(int maxValue, int maxLen){
// int len = (int)(Math.random()*maxLen);
// int[] arr = new int[len];
int[] arr = new int[((int)(Math.random()*(maxLen+1)))];
for(int i=0;i<arr.length;i++){
// arr数组可包含负数
arr[i] = (int)(Math.random()*(maxValue+1) -(int)(Math.random()*maxValue));
}
return arr;
}
public static void main(String[] args){
int maxLen = 50;
int maxValue = 1000;
int testTimes = 10000;
for(int i=0;i<testTimes;i++){
int[] arr = generateRandomArray(maxValue, maxLen);
Arrays.sort(arr);
int num = (int)(Math.random()*(maxValue+1)) - (int)(Math.random()*(maxValue));
int ans = mostLeftNoLessNumIndex(arr, num);
if( ans>=0){
System.out.println("查找到目标数最左边的位置是:" + ans);
}
else {
System.out.println("无法查找到目标数");
}
}
}
}
java 二分查找+对数器验证
于 2022-08-01 20:34:29 首次发布