水塘抽样 - 前进二格

190 阅读1分钟

解决题型

从 `nums` 中选出一个满足 `nums[i] == target` 的随机索引 `i` 。如果存在多个有效的索引,则每个索引的返回概率应当相等。

解题思路

从不确定数量的nums数组中,随机选择某个元素。
随机 的含义是:每个元素被选中的概率相同

解题思路

在数量 N : 1 -> len(nums) 遍历过程中,每个数据被选中的概率相同。
所以在 N 的每一次变化中,需要明确定义是否要覆盖前一次选中的元素。

① 通过随机计算概率 < 1 /N

解题思路

② 通过随机计算 数 == 0 或者 N 等(一个值)

解题思路

代码实现

def getRandom(head):
    i = 1
    choiceNode = None
    while head:
        rand = random.random()
        if rand < (1 / i):
            choiceNode = head.val 
        head = head.next 
        i += 1

or

def getRandom(head):
    i = 1
    choiceNode = None
    while head:
        rand = random.randint(1, i)
        if rand == 0: 
            choiceNode = head.val 
        head = head.next 
        i += 1

对应的Leetcode

382. 链表随机节点

398. 随机数索引