蓄水池算法(链表随机节点)
Posted 秦枫-_-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓄水池算法(链表随机节点)相关的知识,希望对你有一定的参考价值。
/**
* Definition for singly-linked list.
* public class ListNode
* int val;
* ListNode next;
* ListNode()
* ListNode(int val) this.val = val;
* ListNode(int val, ListNode next) this.val = val; this.next = next;
*
*/
class Solution
private ListNode head;
public Solution(ListNode head)
this.head = head;
public int getRandom()
//直接假设袋子容量为1
int count = 1;
int res = head.val;
ListNode temp = head;
temp=temp.next;
while (temp != null)
count++;
if (rand(count) == 1) //第 i 个数被替换(cur进入蓄水池)的概率为1/count,前面第i个数不被替换(cur不进入蓄水池)的概率为(count-1)/count,如此可以做到每个数被保留的概率为m/N
res = temp.val;
temp = temp.next;
return res;
public int rand(int max)
return (int)(Math.random()*max)+1;
以上是关于蓄水池算法(链表随机节点)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 1716. 计算力扣银行的钱 / 382. 链表随机节点(蓄水池抽样) / 1220. 统计元音字母序列的数目(动规,矩阵快速幂)