|
|
@@ -0,0 +1,58 @@
|
|
|
+var empty struct{} = struct{}{}
|
|
|
+
|
|
|
+type RandomizedSet struct {
|
|
|
+ set map[int]struct{}
|
|
|
+ key []int
|
|
|
+}
|
|
|
+
|
|
|
+/** Initialize your data structure here. */
|
|
|
+func Constructor() RandomizedSet {
|
|
|
+ return RandomizedSet{
|
|
|
+ set: make(map[int]struct{}),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
|
|
|
+func (this *RandomizedSet) Insert(val int) bool {
|
|
|
+ if _, ok := this.set[val]; ok {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ this.set[val] = empty
|
|
|
+ this.key = append(this.key, val)
|
|
|
+ return true
|
|
|
+}
|
|
|
+
|
|
|
+/** Removes a value from the set. Returns true if the set contained the specified element. */
|
|
|
+func (this *RandomizedSet) Remove(val int) bool {
|
|
|
+ if _, ok := this.set[val]; ok {
|
|
|
+ delete(this.set, val)
|
|
|
+ if n := len(this.set); 2*n < len(this.key) {
|
|
|
+ this.key = make([]int, n)
|
|
|
+ i := 0
|
|
|
+ for k := range this.set {
|
|
|
+ this.key[i] = k
|
|
|
+ i++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ return false
|
|
|
+}
|
|
|
+
|
|
|
+/** Get a random element from the set. */
|
|
|
+func (this *RandomizedSet) GetRandom() int {
|
|
|
+ for {
|
|
|
+ val := this.key[rand.Intn(len(this.key))]
|
|
|
+ if _, ok := this.set[val]; ok {
|
|
|
+ return val
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Your RandomizedSet object will be instantiated and called as such:
|
|
|
+ * obj := Constructor();
|
|
|
+ * param_1 := obj.Insert(val);
|
|
|
+ * param_2 := obj.Remove(val);
|
|
|
+ * param_3 := obj.GetRandom();
|
|
|
+ */
|