首页 > 代码库 > Leetcode 382. Linked List Random Node

Leetcode 382. Linked List Random Node

本题可以用reservoir sampling来解决不明list长度的情况下平均概率选择元素的问题。

假设在[x_1,...,x_n]只选一个元素,要求每个元素被选中的概率都是1/n,但是n未知。 其中 random.randint(0, cnt) == 0: 的概率是1/(cnt+1)。reservoir sampling的证明可以使用归纳法(induction)。

 

 1 class Solution(object):
 2 
 3     def __init__(self, head):
 4         """
 5         @param head The linked list‘s head.
 6         Note that the head is guaranteed to be not null, so it contains at least one node.
 7         :type head: ListNode
 8         """
 9         self.head = head
10 
11     def getRandom(self):
12         """
13         Returns a random node‘s value.
14         :rtype: int
15         """
16         cnt = 0
17         head = self.head
18         while head:
19             if random.randint(0, cnt) == 0:
20                 ans = head.val
21             head = head.next
22             cnt += 1
23         return ans

 

本题的一个推广是如何在[x_1,...,x_n]中选出k个元素。并且每个x_i被选中的概率都一样,而且n未知。

1. if i <= k, T_i = T_{i-1}\cup x_i

2. else with p = k/i replace one element in T_{i-1} with x_i with p=1/k。

证明同样可以用归纳法。

技术分享

 

Leetcode 382. Linked List Random Node