文章目录
- 说明
- 主要代码
- 全部代码
- 运行结果
说明
大于等于最右不考,意义不大。
直接看(arr.length-1) 位(即数组最后一位),如果大于num,那就说明arr[arr.length-1]是大于等于最右的数字
数组最后一位,如果小于num,说明这个有序数组中不存在大于等于num的数字。
主要代码
//查找数组中<=num的最小值
public static int FindRightMin(int[] arr,int num){
int l = 0;
int r = arr.length - 1;
int m = 0;
int ans = -1 ;
while (l <= r){
m = l + ((r-l)>>1);
if(arr[m] <= num){
ans = m;//m比num小,有可能是小于等于num的最右边的值,所以将 m赋值给ans
l = m + 1;
}else {
r = m - 1;
}
}
return ans;
}
arr[m]比num小,有可能是小于等于num的最右边的值,所以将 m赋值给ans
arr[m]大于num时,m不可能是题目所求值的数组下标,将 ans= m 无意义
全部代码
import java.util.Arrays;
/**
* @Author: ggdpzhk
* @CreateTime: 2024-07-27
* 查找数组中<=num的最小值
*/
public class _006_02_FindRightMin {
public static void main(String[] args) {
int N = 10;
int V = 20;
int testTimes = 5;
for (int i = 0; i < testTimes; 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() * 10 + 1);
System.out.println(num);
FindRightMin(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的最小值
public static int FindRightMin(int[] arr,int num){
int l = 0;
int r = arr.length - 1;
int m = 0;
int ans = -1 ;
while (l <= r){
m = l + ((r-l)>>1);
if(arr[m] <= num){
ans = m;//m比num小,有可能是小于等于num的最右边的值,所以将 m赋值给ans
l = m + 1;
}else {
r = m - 1;
}
}
if(ans == -1){
System.out.println("数组中不存在小于等于num最右边的数");
}else{
System.out.println("数组中存在小于等于num最右边的数:"+arr[m]);
}
return ans;
}
}