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

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

要求:

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


基本思路

  具体过程如下:

  1、在arr[0…N-1]中随机得到一个位置a,然后打印arr[a]。 
  2、把arr[a]和arr[N-1]交换。 
  3、在arr[0…N-2]中随机得到一个位置b,然后打印arr[b],因为打印过的arr[a]已经被换到了N-1位置,所以这次打印不可能在出现。 
  4、把arr[b]和arr[N-2]交换。 
  5、在arr[0…N-3]中随机得到一个位置c,然后打印arr[c],因为打印过的arr[a]和arr[b]已经被换到了N-1位置和N-2位置,所以这次打印不可能在出现。 
  6、依次类推直到打印M个数

  总之,就是把随机选出来的数打印出来,然后将打印的数交换到范围中的最后位置,再把范围缩小,使得被打印的数下次不可能再被选中,直到打印结束
 

def printRandomM(arr,m):
    if arr == None or len(arr) < 1 or m < 1 or len(arr) < m:
        return 

    length = len(arr)
    res = 0

    while res < m:
        index = int(random.random()*n)
        print(arr[index])
        arr[index],arr[n-1] = arr[n-1],arr[index]
        n-=1
        res +=1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值