382. Linked List Random Node
LeetCode上的一道题
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?
思路
已知链表长度 n 时,可以使用
rand()%n //
但此题目提示,链表长度未知,此时需要用到一些概率论的知识。
- 每个元素被抽取概率均为
1/n 时,采样等概- 考虑可覆盖的采样,即后一个采样可以覆盖前一个采样。
- 第
k
个元素,只考虑前
k ,对应概率为 1/k - 假设第
i
个元素,被采中。对应事件为第
i 次采中,之后所有采样均未采中,计算如下
1i⋅(1−1i+1)…(1−1n)=1n
即第 i 个元素被采中的概率为1/n int getRandom() { ListNode *tem = p; int val = p->val; for (int i = 1; tem; i++) { if (rand() % i == 0) val = tem->val; tem = tem->next; } return val; }