【算法基础】从N个数中等概率打印M个数
程序员文章站
2024-02-27 15:07:09
...
相同的数不打印,额外空间复杂度为O(1)
* 思路:
* 在[0,N-1]中获得一个随机数a,并打印arr[a]
* 将arr[a]与arr[N-1]交换
* 在[0,N-2]中获得一个随机数b,并打印arr[b]
* 将arr[b]与arr[N-2]交换
* 以此类推,直到打印完m个数
源代码
package com.javakk.ex;
/**
* @Time 2018年8月30日 上午9:28:10
* @Title { 从N个数中等概率打印M个数 }
* @Desc { 相同的数不打印,额外空间复杂度为O(1) }
* @Email [email protected]
* @Author JavaKK
*/
public class Ex5 {
public static void main(String[] args) {
int[] arr = { 1, 5, 6, 7, 8, 9, 4, 3, 2 };
printRandM(arr, 5);
}
/**
* 思路:
* 在[0,N-1]中获得一个随机数a,并打印arr[a]
* 将arr[a]与arr[N-1]交换
* 在[0,N-2]中获得一个随机数b,并打印arr[b]
* 将arr[b]与arr[N-2]交换
* 以此类推,直到打印完m个数
*
* @param arr
* @param m
*/
public static void printRandM(int[] arr, int m) {
if (arr == null || arr.length == 0 || m < 0) {
return;
}
m = Math.min(arr.length, m);
int count = 0;
int i = 0;
while (count < m) {
i = (int) (Math.random() * (arr.length - count));
System.out.print(arr[i] + " ");
swap(arr, arr.length - count++ - 1, i);
}
}
private static void swap(int[] arr, int from, int to) {
int temp = arr[from];
arr[from] = arr[to];
arr[to] = temp;
}
}
上一篇: Mysql联合查询UNION和Order by同时使用报错问题的解决办法
下一篇: Java判断闰年