leetcode 382 Linked List Random Node C++

来源:互联网 发布:韩氏父子 圆号网络 编辑:程序博客网 时间:2024/05/16 12:44

这个题因为不知道n是多大,不然直接对n取余即可。

所以这个题要用到蓄水池算法。

蓄水池算法编程珠玑上面有。

在不知道有多少个数的情况下,取出k个数,且每个数被取到的概率都相同。

第m个对象被选中的概率=选择m的概率*(其后元素不被选择的概率+其后元素被选择的概率*不替换第m个对象的概率),即

这道题的k就是1,如果不是1的话可以用

rand()%i<k来代替,当然替换的地方也要改动一下。

    Solution(ListNode* head) {        p = head;    }        /** Returns a random node's value. */    int getRandom() {        // srand((int)time(0));        int val = p->val;        ListNode *tmp = p->next;        for(int i = 2;tmp;i++){            if(rand()%i == 0) val = tmp->val;            tmp = tmp->next;        }        return val;    }

另外注意这道题必须要用伪随机数才能过,真随机数过不了。。。

也是,真随机数没法判断了。

0 0
原创粉丝点击