[leetcode]Reservoir Sampling-382. Linked List Random Node

Posted chenhan05

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[leetcode]Reservoir Sampling-382. Linked List Random Node相关的知识,希望对你有一定的参考价值。

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?

Example:

// Init a singly linked list [1,2,3].
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
Solution solution = new Solution(head);

// getRandom() should return either 1, 2, or 3 randomly. Each element should have equal probability of returning.
solution.getRandom();
class Solution {
private:
    ListNode* head;
public:
    Solution(ListNode* head) {
        this->head = head;
    }

    int getRandom() {
        int res = head->val;
        ListNode* node = head->next;
        int i = 2;
        while(node){
            int j = rand()%i;
            if(j==0)
                res = node->val;
            i++;
            node = node->next;
        }
        return res;
    }
};

 



以上是关于[leetcode]Reservoir Sampling-382. Linked List Random Node的主要内容,如果未能解决你的问题,请参考以下文章

Reservoir Sampling - snapchat

Reservoir Sampling

「题解」水库 reservoir

Reservoir Sampling

Reservoir Sampling-382. Linked List Random Node

水塘抽样(Reservoir Sampling)问题