从N个数中等概率打印M个数

本文介绍了如何在给定长度为N的无重复元素数组arr和整数M的情况下,实现一个函数,以等概率随机打印arr中的M个不同元素,确保不重复打印,并要求时间复杂度为O(M),额外空间复杂度为O(1),允许修改原数组。

【题目】

给定一个长度为N且没有重复元素的数组arr和一个整数m,实现函数等概率随机打印arr的M个数。

【要求】

相同的数不要重复打印
时间复杂度为O(M),额外空间复杂度为O(1)
可以改变arr数组

【代码】

//从N个数中等概率打印M个数
    public static void printRandM(int[] arr, int m) {
        if(arr==null||arr.length==0||m<0){
            return;
        }
        m=Math.min(arr.length, m);//防止m取值太大无效
        int count=0;
        int i=0;
        while(count<m){
            i=(int)Math.random()*(arr.length-count);//逐步缩小打印范围
            System.out.println(arr[i]);//在指定范围内随机打印arr[i]
            swap(arr,i,arr.length-count++-1);//打印后将arr[i]换到末尾
        }
    }

【注意】

很多有关等概率随机的面试题都是用这种和最后一个位置交换的解法。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值