382. Linked List Random Node
来源:互联网 发布:js压缩代码还原 编辑:程序博客网 时间:2024/06/06 13:19
Given a singly linked list, return a random node's value from the linked list. Each node must have the same probability of being chosen.
Follow up:
What if the linked list is extremely large and its length is unknown to you? Could you solve this efficiently without using extra space?
Example:
// Init a singly linked list [1,2,3].ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);Solution solution = new Solution(head);// getRandom() should return either 1, 2, or 3 randomly. Each element should have equal probability of returning.solution.getRandom();如果n-1个元素复合要求,即n-1每个元素取到的概率是1/(n - 1),那么如果保证第n个元素取到的概率是1/n,那么对于前n-1个元素,每个元素取到的概率是1/(n - 1) * (n - 1)/n。一个比较好的讲解:
When I first got this question, I went through some articles, but it is painful for me to understand abstract notations like i, k, m, n, n-1, k+1...
After I read this one: http://blog.jobbole.com/42550/, it comes with a simple example and I understood suddenly, and write the code by myself. I translate it to English, so more people can benefit from it.
Start...
When we read the first node head
, if the stream ListNode
stops here, we can just return the head.val
. The possibility is 1/1
.
When we read the second node, we can decide if we replace the result r
or not. The possibility is 1/2
. So we just generate a random number between 0
and 1
, and check if it is equal to 1
. If it is 1
, replace r
as the value of the current node, otherwise we don't touch r
, so its value is still the value of head.
When we read the third node, now the result r
is one of value in the head or second node. We just decide if we replace the value of r
as the value of current node(third node)
. The possibility of replacing it is 1/3
, namely the possibility of we don't touch r
is 2/3
. So we just generate a random number between 0 ~ 2
, and if the result is 2
we replace r
.
We can continue to do like this until the end of stream ListNode
.
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */public class Solution { ListNode head; Random random; /** @param head The linked list's head. Note that the head is guaranteed to be not null, so it contains at least one node. */ public Solution(ListNode head) { this.head = head; random = new Random(); } /** Returns a random node's value. */ public int getRandom() { ListNode curr = head; int res = curr.val; for (int i = 1; curr.next != null; i ++) { curr = curr.next; if (random.nextInt(i + 1) == i) res = curr.val; } return res; }}/** * Your Solution object will be instantiated and called as such: * Solution obj = new Solution(head); * int param_1 = obj.getRandom(); */
- 382. Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node**
- 382. Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node
- 382. Linked List Random Node
- Linked List Random Node
- 阿里分布式开放消息服务(ONS)原理与实践——笔记整理
- Ubuntu学习日记--Lesson7:文件权限管理chmod
- Optimization of Parallel Calculate Prime Numbers
- 反射之getMethods()与getDeclaredMethods()
- 日志提取程序
- 382. Linked List Random Node
- 第一章 什么是面向对象编程
- Ajax之搭建一个基本的Ajax框架(技术分析篇)
- 做一个改变自己目前生活习惯的决定
- 安卓猜数字小游戏4
- intelli idea 如何导入maven项目
- 数据结构实验之图论六:村村通公路[prim 最小生成树]
- PHP连接sqlserver2000数据库
- 关于MVC4使用PagedList.mvc分页