如何从长度为
例如输入:
例如输出:
当
m
的Java BitSet数据中选择恰好k
个已打开的位,其中有n
个已打开,且k≤n≤m
?例如输入:
m=20, n=11
![enter image description here](https://istack.dev59.com/oh48j.webp)
k=3
![enter image description here](https://istack.dev59.com/ZukGi.webp)
朴素方法
选择一个随机数0≤ i ≤ m-1
。如果这个数在输入中被打开并且在输出中未被打开,则打开它,在输出中重复此步骤,直到有k
个位在输出中被打开。当
n
远小于m
时,此方法会失败。还有其他想法吗?
n
非常大而k
非常小的情况下效率较低。 - Adam Matanm-k
次。如果不是很快,你可以在[0..n)
中选择k
个值,跳过重复项(k/n
约为 0,因此这是有效的),放入排序集合中。然后,在m
规模上,你唯一需要做的就是计算集合位,并注意每当你的计数在随机值集合中时。获取n
可能会有问题,因为它需要额外的传递来进行计数。 - maybeWeCouldStealAVan