文章目录
- 说明
- 主要代码
- 全部代码
- 运行结果
说明
大于等于最右不考,意义不大。
直接看(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赋值给ansl = 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赋值给ansl = m + 1;}else {r = m - 1;}}if(ans == -1){System.out.println("数组中不存在小于等于num最右边的数");}else{System.out.println("数组中存在小于等于num最右边的数:"+arr[m]);}return ans;}
}