LeetCode 382 链表随机节点[水塘抽样] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 382 链表随机节点[水塘抽样] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
最朴素的思路就是遍历所有的节点,用vector存储其节点的值,最后返回数组中用rand() % size的随机值,代码如下:
/**
* Definition for singly-linked list.
* struct ListNode
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr)
* ListNode(int x) : val(x), next(nullptr)
* ListNode(int x, ListNode *next) : val(x), next(next)
* ;
*/
class Solution
private:
vector<int> ans;
public:
Solution(ListNode* head)
while(head != nullptr)
ans.push_back(head->val);
head = head->next;
int getRandom()
return ans[rand() % ans.size()];
;
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(head);
* int param_1 = obj->getRandom();
*/
上述方法的空间复杂度为O(n),但是如果用水塘抽样的方法可以优化为O(1),水塘抽样核心思想是当第i次抽中了位置为i的节点时,之后到n次都不会抽到该节点的概率计算如下,为1/n,即每个数在这样操作下被抽中的概率都是1/n。代码如下:
/**
* Definition for singly-linked list.
* struct ListNode
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr)
* ListNode(int x) : val(x), next(nullptr)
* ListNode(int x, ListNode *next) : val(x), next(next)
* ;
*/
class Solution
private:
ListNode * head;
public:
Solution(ListNode* head)
this->head = head;
int getRandom()
ListNode * temp = head;
int val = temp->val;
int i = 1;
while(temp != nullptr)
if(rand() % i == 0)
val = temp->val;
temp = temp->next;
i ++;
return val;
;
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(head);
* int param_1 = obj->getRandom();
*/
以上是关于LeetCode 382 链表随机节点[水塘抽样] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Algorithm 382. 链表随机节点
LeetCode 1716. 计算力扣银行的钱 / 382. 链表随机节点(蓄水池抽样) / 1220. 统计元音字母序列的数目(动规,矩阵快速幂)
LeetCode 398 随机数索引[水塘抽样] HERODING的LeetCode之路