查找数组中>=num的最大值
在查找数组arr中大于等于给定值num的最左值时,之所以不用特别考虑num是否存在于数组中,
是因为这个问题关注的是找到一个满足条件(即大于等于num)的元素中位置最靠左的那个。
这个查找过程与num是否直接作为数组元素存在没有直接关系。
小于等于最左不考,意义不大。
直接看第0位,如果小于num,那就说明arr[0]是小于等于最左的数字
第0位,如果大于num,说明这个有序数组中不存在小于等于num的数字。
主要代码
public static int findLeft(int[] arr,int num){
int l = 0;
int r = arr.length - 1;
int m = 0;
int ans = -1;//如果出错就返回-1 如果正确就返回 >= num最左的位置
while(l <= r){
m = l + ((r-l) >> 1);
if (arr[m] >= num){
ans = m;//大于记答案
//num小,arr[m]大,说明m有可能是 大于等于num的最左值
r = m - 1;
}else {
l = m + 1;
//arr[m]小,num大。 m不可能是 大于等于num的最左值。
//记ans 没意义
}
}
return ans;
}
大于记答案
num小,arr[m]大,说明m有可能是 大于等于num的最左值
arr[m]小,num大。 m不可能是 大于等于num的最左值。
记ans 没意义
全部代码
import java.util.Arrays;
/**
* @Author: ggdpzhk
* @CreateTime: 2024-07-27
* 数组中找大于等于num最左边的位置
*/
public class _006_01_FindLeft {
public static void main(String[] args) {
int N = 5;
int V = 10;
int testTimse = 3;
for(int i = 0 ; i < testTimse;i++) {
System.out.println("第"+(i+1)+"次测试");
int n = (int) (Math.random() * N + 1);
int[] arr = randomArray(n, V);
System.out.println("随机生成的数组是:" + Arrays.toString(arr));
// int num = (int)(Math.random() * 3+1);
int num = 8;
System.out.println("num是" + num);
findLeft(arr,num);
System.out.println("---------------------");
}
}
public static int[] randomArray(int n,int V){
int[] arr = new int[n];
for(int i = 0;i < arr.length;i++){
arr[i] = (int)(Math.random()*V+1);
}
Arrays.sort(arr);
return arr;
}
//数组须有序
//不用管数组中有没有num
/*在查找数组arr中大于等于给定值num的最左值时,之所以不用特别考虑num是否存在于数组中,
是因为这个问题关注的是找到一个满足条件(即大于等于num)的元素中位置最靠左的那个。
这个查找过程与num是否直接作为数组元素存在没有直接关系。*/
public static int findLeft(int[] arr,int num){
int l = 0;
int r = arr.length - 1;
int m = 0;
int ans = -1;//如果出错就返回-1 如果正确就返回 >= num最左的位置
while(l <= r){
m = l + ((r-l) >> 1);
if (arr[m] >= num){
ans = m;//大于记答案
//num小,arr[m]大,说明m有可能是 大于等于num的最左值
r = m - 1;
}else {
l = m + 1;
//arr[m]小,num大。 m不可能是 大于等于num的最左值。
//记ans 没意义
}
}
if(ans == -1){
System.out.println("数组中不存在>=num最左边的数");
}else {
System.out.println("数组中>=num最左边的数是"+arr[m]);
}
return ans;
}
}