LeetCode #382: Linked List Random Node
来源:互联网 发布:网络电视下载 编辑:程序博客网 时间:2024/05/16 14:35
Problem Statement
(Problem Link) Given a singly linked list, return a random node’s value from the linked list. Each node must have the same probability of being chosen.
Follow up:
What if the linked list is extremely large and its length is unknown to you? Could you solve this efficiently without using extra space?
Example:
// Init a singly linked list [1,2,3].ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);Solution solution = new Solution(head);// getRandom() should return either 1, 2, or 3 randomly. Each element should have equal probability of returning.solution.getRandom();
Analysis
Reservoir sampling
Reservoir Sampling Sample size 1: Suppose we see a sequence of items, one at a time. We want to keep a single item in memory, and we want it to be selected at random from the sequence. If we know the total number of items (n), then the solution is easy: select an index i between 1 and n with equal probability, and keep the i-th element. The problem is that we do not always know n in advance. A possible solution is the following:
- Keep the first item in memory.
- When the i-th item arrives (for i>1):
- with probability 1/i, keep the new item instead of the current item; or equivalently
- with probability 1-1/i, keep the current item and discard the new item.
So:
* when there is only one item, it is kept with probability 1;
* when there are 2 items, each of them is kept with probability 1/2;
* when there are 3 items, the third item is kept with probability 1/3, and each of the previous 2 items is also kept with probability (1/2)(1-1/3) = (1/2)(2/3) = 1/3;
* by induction, it is easy to prove that when there are n items, each item is kept with probability 1/n.
Solution
# Definition for singly-linked list.# class ListNode(object):# def __init__(self, x):# self.val = x# self.next = Noneclass Solution(object): def __init__(self, head): """ @param head The linked list's head. Note that the head is guaranteed to be not null, so it contains at least one node. :type head: ListNode """ self.head = head def getRandom(self): """ Returns a random node's value. :rtype: int """ from random import randint p = self.head res = p.val i = 2 p = p.next while p: if randint(1, i) == 1: res = p.val p = p.next i += 1 return res# Your Solution object will be instantiated and called as such:# obj = Solution(head)# param_1 = obj.getRandom()
- LeetCode:382 Linked List Random Node
- LeetCode #382: Linked List Random Node
- leetcode 382 Linked List Random Node C++
- LeetCode[382] Linked List Random Node
- [leetcode][382] Linked List Random Node
- LeetCode 382 Linked List Random Node
- 【Leetcode】Linked List Random Node
- LeetCode - Linked List Random Node
- [leetcode]-Linked List Random Node
- [382]Linked List Random Node
- leetcode: Reservoir Sampling:Linked List Random Node(382)
- LeetCode 382 Linked List Random Node (蓄水池算法 推荐)
- LeetCode:382 Linked List Random Node蓄水池抽样算法
- 边刷leetcode边学编程-382 Linked List Random Node
- [leetcode] 382. Linked List Random Node
- <LeetCode OJ> 382. Linked List Random Node
- LeetCode—382. Linked List Random Node
- leetcode之Linked List Random Node
- js判断设备,跳转app应用、android市场或者AppStore
- JavaScript趣题:点、线、面
- qt写的一个简单的tcp服务器程序,可以接受消息发送数据
- 单点登录
- java代码中打印出一个函数的调用堆栈
- LeetCode #382: Linked List Random Node
- 在Android Studio上进行OpenCV 3.1开发
- Solr使用入门指南 (二)
- 怎样从项目中移除CocoaPods?
- handler更新UI四种方式的简单实现
- C语言学习随笔(3)—— 学习内容简述
- Activity5----配置
- 关于std::ios::sync_with_stdio(false);
- Ubuntu中如何切换到超级用户(root)及在VMware虚拟机中Linux在虚拟终端之间切换的方法