给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。每个节点 被选中的概率一样 。实现 Solution 类:
Solution(ListNode head) 使用整数数组初始化对象。
int getRandom() 从链表中随机选择一个节点并返回该节点的值。链表中所有节点被选中的概率相等。
直接法:
设置数组记录链表节点的值,用java的 Random库随机选取
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()));
}
}
水塘抽样法:
从链表头开始,遍历整个链表,对遍历到的第 ii 个节点,随机选择区间 [0,i)内的一个整数,如果其等于 00,则将答案置为该节点值,否则答案不变
class Solution {
ListNode head;
Random random;
public Solution(ListNode head) {
this.head = head;
random = new Random();
}
public int getRandom() {
int i = 1, ans = 0;
for (ListNode node = head; node != null; node = node.next) {
if (random.nextInt(i) == 0) { // 1/i 的概率选中(替换为答案)
ans = node.val;
}
++i;
}
return ans;
}
}