蓄水池算法(链表随机节点)
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. 统计元音字母序列的数目(动规,矩阵快速幂)