首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。