1
+ package com .leetcode .design ;
2
+
3
+ import java .util .*;
4
+
5
+ import static org .junit .jupiter .api .Assertions .*;
6
+
7
+ /**
8
+ * Level: Medium
9
+ * Link: https://leetcode.com/problems/insert-delete-getrandom-o1/
10
+ * Description:
11
+ * Design a data structure that supports all following operations in average O(1) time.
12
+ *
13
+ * insert(val): Inserts an item val to the set if not already present.
14
+ * remove(val): Removes an item val from the set if present.
15
+ * getRandom: Returns a random element from current set of elements. Each element must have the same probability of
16
+ * being returned.
17
+ *
18
+ * Example:
19
+ *
20
+ * // Init an empty set.
21
+ * RandomizedSet randomSet = new RandomizedSet();
22
+ *
23
+ * // Inserts 1 to the set. Returns true as 1 was inserted successfully.
24
+ * randomSet.insert(1);
25
+ *
26
+ * // Returns false as 2 does not exist in the set.
27
+ * randomSet.remove(2);
28
+ *
29
+ * // Inserts 2 to the set, returns true. Set now contains [1,2].
30
+ * randomSet.insert(2);
31
+ *
32
+ * // getRandom should return either 1 or 2 randomly.
33
+ * randomSet.getRandom();
34
+ *
35
+ * // Removes 1 from the set, returns true. Set now contains [2].
36
+ * randomSet.remove(1);
37
+ *
38
+ * // 2 was already in the set, so return false.
39
+ * randomSet.insert(2);
40
+ *
41
+ * // Since 2 is the only number in the set, getRandom always return 2.
42
+ * randomSet.getRandom();
43
+ *
44
+ * Runtime: <a href="https://leetcode.com/submissions/detail/250682053/>52 ms</a>.
45
+ *
46
+ * @author rampatra
47
+ * @since 2019-08-11
48
+ */
49
+ public class InsertDeleteGetRandom {
50
+ // store the val and its index (from the array list to make the remove O(1))
51
+ Map <Integer , Integer > valuesToIndexMap ;
52
+ List <Integer > values ;
53
+ Random random ;
54
+
55
+ InsertDeleteGetRandom () {
56
+ valuesToIndexMap = new HashMap <>();
57
+ values = new ArrayList <>();
58
+ random = new Random ();
59
+ }
60
+
61
+ boolean insert (int val ) {
62
+ if (valuesToIndexMap .containsKey (val )) {
63
+ return false ;
64
+ }
65
+
66
+ valuesToIndexMap .put (val , values .size ());
67
+ values .add (val );
68
+ return true ;
69
+ }
70
+
71
+ boolean remove (int val ) {
72
+ Integer index = valuesToIndexMap .get (val );
73
+
74
+ if (index == null ) {
75
+ return false ;
76
+ }
77
+
78
+ if (index != values .size () - 1 ) {
79
+ int lastValue = values .get (values .size () - 1 );
80
+ values .set (index , lastValue ); // replace the value with the last value
81
+ valuesToIndexMap .put (lastValue , index ); // update index in the map
82
+ }
83
+ values .remove (values .size () - 1 );
84
+ return valuesToIndexMap .remove (val , index );
85
+ }
86
+
87
+ int getRandom () {
88
+ return values .get (random .nextInt (values .size ()));
89
+ }
90
+
91
+ public static void main (String [] args ) {
92
+ InsertDeleteGetRandom randomizedSet = new InsertDeleteGetRandom ();
93
+ assertTrue (randomizedSet .insert (2 ));
94
+ assertTrue (randomizedSet .insert (-1 ));
95
+ assertFalse (randomizedSet .remove (-10 ));
96
+ assertTrue (randomizedSet .remove (-1 ));
97
+ assertEquals (2 , randomizedSet .getRandom ());
98
+ assertTrue (randomizedSet .remove (2 ));
99
+ assertFalse (randomizedSet .remove (-2 ));
100
+ assertFalse (randomizedSet .remove (-20 ));
101
+ assertFalse (randomizedSet .remove (-30 ));
102
+ assertFalse (randomizedSet .remove (2 ));
103
+ assertFalse (randomizedSet .remove (1 ));
104
+ assertFalse (randomizedSet .remove (0 ));
105
+ }
106
+ }
0 commit comments