1,题目
力扣https://leetcode.cn/problems/linked-list-random-node/
2,解题
class Solution {
private int count=0;
private ListNode head;
private Random r =new Random();
//记录头结点和链表长度
public Solution(ListNode head) {
this.head=head;
while(head !=null){
count++;
head=head.next;
}
}
//利用Random的nextInt()获取随机整数,并找到相应节点
public int getRandom() {
ListNode node=head;
for(int i=r.nextInt(count);i>0;i--){
node=node.next;
}
return node.val;
}
}
//水塘抽样(假设总共有n个数)(用于大量未知长度数据流)
//随机选择一个数:当遇到第i个元素时,应该有1/i的概率选择该元素,1-1/i的概率保持原有的选择。(判断随机数是否为0)
//证明:P选择=第i元素选择概率与其后面元素保持原有选择概率之积=1/n(其前面元素有多种选择情况,不易计算)
//例如选择第一个元素概率:1*P(此后一直保持原有选择)=1/n
//随机选择k个数:在第i个元素处以k/i的概率选择该元素,以1-k/i的概率保持原有选择即可(通过判断随机数是否小于k)
class Solution {
private ListNode head;
private Random r=new Random();
public Solution(ListNode head) {
this.head=head;
}
public int getRandom() {
int answer=0;
ListNode node=head;
for(int i=0;node!=null;node=node.next){
if(r.nextInt(i+1)==0){
answer=node.val;
//第一个元素一定会被选,但是此后是否改变答案不确定,即answer一定会被赋值。
}
i++;
}
return answer;
}
}
3,运行截图