|
1 | 1 | package Problem0380
|
2 | 2 |
|
3 | 3 | import "math/rand"
|
| 4 | +import "fmt" |
4 | 5 |
|
5 | 6 | // RandomizedSet 是一个随机获取的集合
|
6 | 7 | type RandomizedSet struct {
|
7 |
| - rec map[int]bool |
| 8 | + a []int |
| 9 | + idx map[int]int // idx 的 v 是 k 在 a 中的位置。 |
8 | 10 | }
|
9 | 11 |
|
10 | 12 | // Constructor returns RandomizedSet
|
11 | 13 | /** Initialize your data structure here. */
|
12 | 14 | func Constructor() RandomizedSet {
|
13 | 15 | return RandomizedSet{
|
14 |
| - rec: make(map[int]bool), |
| 16 | + a: []int{}, |
| 17 | + idx: make(map[int]int), |
15 | 18 | }
|
16 | 19 | }
|
17 | 20 |
|
18 | 21 | // Insert 插入数据
|
19 | 22 | /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
|
20 | 23 | func (r *RandomizedSet) Insert(val int) bool {
|
21 |
| - if _, ok := r.rec[val]; ok { |
| 24 | + if _, ok := r.idx[val]; ok { |
22 | 25 | return false
|
23 | 26 | }
|
24 |
| - r.rec[val] = true |
| 27 | + r.a = append(r.a, val) |
| 28 | + r.idx[val] = len(r.a) - 1 |
25 | 29 | return true
|
26 | 30 | }
|
27 | 31 |
|
28 | 32 | // Remove 删除数据
|
29 | 33 | /** Removes a value from the set. Returns true if the set contained the specified element. */
|
30 | 34 | func (r *RandomizedSet) Remove(val int) bool {
|
31 |
| - if _, ok := r.rec[val]; ok { |
32 |
| - delete(r.rec, val) |
33 |
| - return true |
| 35 | + if _, ok := r.idx[val]; !ok { |
| 36 | + return false |
34 | 37 | }
|
35 | 38 |
|
36 |
| - return false |
| 39 | + // 把 a 的最后一个数,放入待删除的数的位置 |
| 40 | + r.a[r.idx[val]] = r.a[len(r.a)-1] |
| 41 | + // 删除最后一个数 |
| 42 | + r.a = r.a[:len(r.a)-1] |
| 43 | + // 在 r.m 中删除 val 的记录 |
| 44 | + delete(r.idx, val) |
| 45 | + |
| 46 | + return true |
37 | 47 | }
|
38 | 48 |
|
39 | 49 | // GetRandom 获取随机数据
|
40 | 50 | /** Get a random element from the set. */
|
41 | 51 | func (r *RandomizedSet) GetRandom() int {
|
42 |
| - if len(r.rec) == 0 { |
43 |
| - return 0 |
44 |
| - } |
45 |
| - |
46 |
| - rnd := rand.Int() % len(r.rec) |
47 |
| - res := 0 |
48 |
| - for k := range r.rec { |
49 |
| - if rnd == 0 { |
50 |
| - res = k |
51 |
| - break |
52 |
| - } |
53 |
| - rnd-- |
54 |
| - } |
55 |
| - |
56 |
| - return res |
| 52 | + fmt.Println(r.a) |
| 53 | + return r.a[rand.Intn(len(r.a))] |
57 | 54 | }
|
58 | 55 |
|
59 | 56 | /**
|
|
0 commit comments