O(1) 时间插入、删除和获取随机元素

https://leetcode.cn/problems/insert-delete-getrandom-o1/description/

type RandomizedSet struct {
    arr       []int
    randomMap map[int]int
}

func Constructor() RandomizedSet {
    return RandomizedSet{
        arr:       []int{},
        randomMap: make(map[int]int),
    }
}

func (this *RandomizedSet) Insert(val int) bool {
    if _, ok := this.randomMap[val]; ok {
        return false
    }
    this.arr = append(this.arr, val)
    this.randomMap[val] = len(this.arr) - 1
    return true
}

func (this *RandomizedSet) Remove(val int) bool {
    index, ok := this.randomMap[val]
    if !ok {
        return false
    }
    valToSwap := this.arr[len(this.arr)-1]
    this.arr[index], this.arr[len(this.arr)-1] = this.arr[len(this.arr)-1], this.arr[index]
    this.randomMap[valToSwap] = index
    this.arr = this.arr[:len(this.arr)-1]
    delete(this.randomMap, val)
    return true
}

func (this *RandomizedSet) GetRandom() int {
    if len(this.arr) == 0 {
        return -1 // 或者抛出错误
    }
    return this.arr[rand.Intn(len(this.arr))]
}

/**
 * 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();
 */