mirror of
https://github.com/ShusenTang/LeetCode.git
synced 2024-09-02 14:20:01 +00:00
add 382 C++ code
This commit is contained in:
parent
b96bfbf60b
commit
f303973261
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# 思路
|
# 思路
|
||||||
给定一个链表,让随机返回一个节点,最直接的方法就是先统计出链表的长度,然后根据长度随机生成一个位置,然后从开头遍历到这个位置即可。
|
给定一个链表,让随机返回一个节点,最直接的方法就是先统计出链表的长度,然后根据长度随机生成一个位置,然后从开头遍历到这个位置即可。
|
||||||
最直接的思路需要两次遍历链表,此题其实是著名的[蓄水池采样(Reservoir Sampling)](https://zh.wikipedia.org/wiki/%E6%B0%B4%E5%A1%98%E6%8A%BD%E6%A8%A3)算法要解决的问题,只需要一次遍历。下面介绍这个算法。
|
最直接的思路需要两次遍历链表,此题其实是著名的[蓄水池采样(Reservoir Sampling)](https://zh.wikipedia.org/wiki/%E6%B0%B4%E5%A1%98%E6%8A%BD%E6%A8%A3)算法要解决的问题([398题](https://leetcode.com/problems/random-pick-index/)也是用此算法),只需要一次遍历。下面介绍这个算法。
|
||||||
|
|
||||||
从一个群体中随机抽样出k个个体是经常会遇到的抽样问题,当事先不知道群体大小时,我可以先遍历一次数据计算出数据量N, 然后再按照上述的方法进行采样即可。
|
从一个群体中随机抽样出k个个体是经常会遇到的抽样问题,当事先不知道群体大小时,我可以先遍历一次数据计算出数据量N, 然后再按照上述的方法进行采样即可。
|
||||||
这当然可以,但是并不好,因为有时候数据只有一次访问的机会,或者很难确定数据规模有多大,例如当内存无法加载全部数据时,如何从包含未知大小的数据流中随机选取k个数据,并且要保证每个数据被抽取到的概率相等。
|
这当然可以,但是并不好,因为有时候数据只有一次访问的机会,或者很难确定数据规模有多大,例如当内存无法加载全部数据时,如何从包含未知大小的数据流中随机选取k个数据,并且要保证每个数据被抽取到的概率相等。
|
||||||
@ -26,3 +26,34 @@
|
|||||||
|
|
||||||
综合上面两个结论可知,数据流中所有元素最后留在水池中的概率均为`k/n`,得证。
|
综合上面两个结论可知,数据流中所有元素最后留在水池中的概率均为`k/n`,得证。
|
||||||
|
|
||||||
|
此题是蓄水池抽样算法的特殊情况:k=1。有了上面的分析就不难写出代码了。
|
||||||
|
|
||||||
|
# C++
|
||||||
|
``` C++
|
||||||
|
class Solution {
|
||||||
|
private:
|
||||||
|
ListNode *root;
|
||||||
|
public:
|
||||||
|
/** @param head The linked list's head.
|
||||||
|
Note that the head is guaranteed to be not null, so it contains at least one node. */
|
||||||
|
Solution(ListNode* head) {
|
||||||
|
root = head;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns a random node's value. */
|
||||||
|
int getRandom() {
|
||||||
|
ListNode *p = root;
|
||||||
|
int res = -1;
|
||||||
|
|
||||||
|
int count = 1;
|
||||||
|
while(p){
|
||||||
|
if(rand() % count == 0) res = p -> val;
|
||||||
|
p = p -> next; count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user