package b;
import java.util.Arrays;
/**
* @author 真他喵的学不动咯
* @create 2022-08-08--19:46
*/
public class Themostleft { //二分法>>>在有序数组中找到>=num最左的位置
public static void main(String[] args) {
int tesTime = 10000;
int maxSize = 10;
int maxValue = 100;
boolean succeed = true;
for (int i = 0; i < tesTime; i++) {
int[] arr = generRandomArray(maxSize, maxValue); //用数组发生器产生数组
Arrays.sort(arr);
int value = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random()); //确定一个num的随机数
if (test(arr, value) != mostLeftNpLessNumIndex(arr, value)) {
printArray(arr);
System.out.println(value);
System.out.println(test(arr, value));
System.out.println(mostLeftNpLessNumIndex(arr, value));
succeed = false;
break;
}
}
System.out.println(succeed ? "成功" : "失败");
}
//[1,2,2,2,5,4,6] 如果num=2,返回索引1
public static int mostLeftNpLessNumIndex(int[] arr, int num) {
//先写边界条件
if (arr == null || arr.length == 0) { //返回-1表示无此概念
return -1;
}
int L = 0;
int R = arr.length - 1;
int ans = -1; //ans为索引
while (L <= R) {
int mid = (L + R) / 2;
if (arr[mid] >= num) { // num arr[mid]
ans = mid; //索引变mid,需要缩区间
R = mid - 1; //更新R
} else { //如果arr[mid]<num,arr[mid] num
//直接砍掉左边,因为目的是寻找num这个值,这种情况目标一定在,arr[mid]~num中间,不需要缩区间
L = mid + 1;
}
}
return ans; ///返回最left索引
}
//对数器
public static int test(int[] arr, int value) { //从左向右遍历数组,发现等于或者大于value的值,就马上返回其索引
for (int i = 0; i < arr.length; i++) {
if (arr[i] >= value) {
return i;
}
}
return -1;
}
//输出数组的方法
public static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
//相当于一个产生随机长度、随机值的数组发生器
public static int[] generRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];//new一个随机长度的数组
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random()); //数组的值随便赋值
}
return arr;
}
}
//二分法>>>在有序数组中找到>=num最左的位置
最新推荐文章于 2023-05-24 19:44:13 发布