这个问题见了很多,一般表述是,1到n的整数中随机选k个这k个不能重复。变一下即可以是n个元素选k个,不能重复。
有不同复杂度的算法。第一个是笨办法:
(1)随机选一个数,然后判断这个数字是否已经被选过了(是否重复),不过不重复,那就就选他了,如果重复,就再随机选一个。
空间复杂度:O(1)
时间复杂度:O(k^2)
而且有一个问题,如果是100个选90个,那么最后冲突的概率很大,选一个数字要重复随机好多次才行。效率低。不要。
如果用hash来解决判重的问题:
空间:O(n)
时间:O(k)
(2)第二种是第一种的改进。先在1到n-k+1中随机选一个,然后把范围扩大到n-k+2,再随机选一个,如果随机选中的是之前已经选过的,那么就选择第n-k+2个元素。
比如:从1-8中选4个数字。
第一步.从1到5中随机选一个,比如选了2.
第二步。从1到6中随机选一个。如果选出的是i=1,3,4,5,6,那么就选i即可。如果选出的是2,这个时候就重复了,此时的处理方式是选择i=6。
第三步,从1到7中随机选一个数,如果跟之前的重复,那么就选那种7.
第四步从1到8中随机选一个数,如个之前的重复,就选8。
空间复杂度:O(1)
时间复杂度:O(k^2)
这