链表随机节点
题目描述
- 给定一个单链表,随机选择链表的一个节点,并返回相应的节点值。保证每个节点被选的概率一样。
题解(C++)
class Solution {
public:
ListNode* head;
Solution(ListNode* head) {
this->head = head;
}
int getRandom() {
ListNode* phead = this->head;
int val = phead->val;
int count = 1;
while (phead){
//保证每个数取到的概率都是1/count;
if (rand() % count++ == 0)
val = phead->val;
phead = phead->next;
}
return val;
}
};
拓展(蓄水池算法)
- 蓄水池算法:蓄水池算法是针对从一个序列中随机抽取不重复的K个数,保证每个数被抽到的概率都为K/N这个问题构建的。
- 我们采用数学归纳法证明类似结论
- 如图:
- 扩展问题:如何从一个未知长度的文本文件中不重复地选择K行?
详解(蓄水池算法)
-
1>. rand() % count:取0到count之间的一个随机数(整数,不包括count)
-
2>. count++ 和 ++count区别:count++是先算后加,++count为先加后算
-
该题之所以是判断的条件等于零,是因为取的是整数,取到0的概率正好为1/n
声明
- 原作者:E.L.E
- <本文章著作权归作者所有,商业转载请获得作者授权,非商业转载请注明出处>
- <欢迎大家评论>