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. 链表随机节点

382. 链表随机节点Normal水塘抽样算法

LeetCode 1716. 计算力扣银行的钱 / 382. 链表随机节点(蓄水池抽样) / 1220. 统计元音字母序列的数目(动规,矩阵快速幂)

LeetCode 398 随机数索引[水塘抽样] HERODING的LeetCode之路

[LeetCode] 382. Linked List Random Node 链表随机节点

水塘抽样算法