题目
给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。每个节点 被选中的概率一样 。
实现 Solution 类:
Solution(ListNode head) 使用整数数组初始化对象。
int getRandom() 从链表中随机选择一个节点并返回该节点的值。链表中所有节点被选中的概率相等。
解题思路
摆烂做法是用个数组存一下,然后用随机数获取下标返回。进阶做法是蓄水池抽样算法,这个记一下模板了,懒得去关心证明过程。
代码
摆烂做法
class Solution {
List<Integer> list;
Random random;
public Solution(ListNode head) {
list = new ArrayList<Integer>();
while (head != null) {
list.add(head.val);
head = head.next;
}
random = new Random();
}
public int getRandom() {
return list.get(random.nextInt(list.size()));
}
}
蓄水池抽样
class Solution {
ListNode head;
Random random;
public Solution(ListNode head) {
this.head = head;
random = new Random();
}
public int getRandom() {
int ans = 0, i = 1;
ListNode p = head;
while (p != null) {
if (random.nextInt(i) == 0) {
ans = p.val;
}
i++;
p = p.next;
}
return ans;
}
}