@@ -50,7 +50,7 @@ solution.getRandom(); // 返回 3
5050
5151在查询时随机一个下标,并将数组中对应下标内容返回出去。
5252
53- 代码:
53+ ** 代码(感谢 [ @ Benhao ] ( /u/himymben/ ) 同学提供的其他语言版本): **
5454``` Java
5555class Solution {
5656 List<Integer > list = new ArrayList<> ();
@@ -67,6 +67,36 @@ class Solution {
6767 }
6868}
6969```
70+ -
71+ ``` Python3
72+ class Solution :
73+ 74+ def __init__ (self , head : Optional[ListNode]):
75+ self .nodes = []
76+ while head:
77+ self .nodes.append(head)
78+ head = head.next
79+ 80+ def getRandom (self ) -> int :
81+ return self .nodes[randint(0 , len (self .nodes) - 1 )].val
82+ ```
83+ -
84+ ``` Golang
85+ type Solution struct {
86+ Nodes []int
87+ }
88+ func Constructor (head *ListNode ) Solution {
89+ nodes := make ([]int , 0 )
90+ for head != nil {
91+ nodes = append (nodes, head.Val )
92+ head = head.Next
93+ }
94+ return Solution{nodes}
95+ }
96+ func (this *Solution ) GetRandom () int {
97+ return this.Nodes [rand.Intn (len (this.Nodes ))]
98+ }
99+ ```
70100* 时间复杂度:令 $n$ 为链表长度,预处理数组的复杂度为 $O(n)$;随机获取某个值的复杂度为 $O(1)$
71101* 空间复杂度:$O(n)$
72102
101131
102132因此,在每一次 ` getRandom ` 时,从前往后处理每个节点,同时记录当前节点的编号,当处理到节点 $k$ 时,在 $[ 0, k)$ 范围内进行随机,若随机到结果为 0ドル$(发生概率为 $\frac{1}{k}$),则将节点 $k$ 的值存入答案,最后一次覆盖答案的节点即为本次抽样结果。
103133
104- 代码:
134+ ** 代码(感谢 [ @ Benhao ] ( /u/himymben/ ) 同学提供的其他语言版本): **
105135``` Java
106136class Solution {
107137 ListNode head;
@@ -120,14 +150,47 @@ class Solution {
120150 }
121151}
122152```
153+ -
154+ ``` Python3
155+ class Solution :
156+ 157+ def __init__ (self , head : Optional[ListNode]):
158+ self .root = head
159+ 160+ def getRandom (self ) -> int :
161+ node, ans, i = self .root, None , 0
162+ while node:
163+ if not randint(0 , i):
164+ ans = node.val
165+ node, i = node.next, i + 1
166+ return ans
167+ ```
168+ -
169+ ``` Golang
170+ type Solution struct {
171+ Root *ListNode
172+ }
173+ func Constructor (head *ListNode ) Solution {
174+ return Solution{head}
175+ }
176+ func (this *Solution ) GetRandom () (ans int ) {
177+ for node , idx := this.Root , 1 ;node != nil ; idx++ {
178+ if rand.Intn (idx) == 0 {
179+ ans = node.Val
180+ }
181+ node = node.Next
182+ }
183+ return
184+ }
185+ ```
123186* 时间复杂度:令 $n$ 为链表长度,随机获取某个值的复杂度为 $O(n)$
124187* 空间复杂度:$O(1)$
125188
126189---
127190
128191### 最后
129192
130- 这是我们「刷穿 LeetCode」系列文章的第 ` No.383 ` 篇,系列开始于 2021年01月01日,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
193+ 这是我们「刷穿 LeetCode」系列文章的第 ` No.382 ` 篇,系列开始于 2021年01月01日,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
131194
132195在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
133196
0 commit comments