| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 | type pair struct {	_1 int	_2 *list.Element}type RandomizedCollection struct {	nums []pair	size int	pos  map[int]*list.List // Hash map + linked list, O(1) get random, O(1) insert, O(1) remove (average)}/** Initialize your data structure here. */func Constructor() RandomizedCollection {	return RandomizedCollection{pos: make(map[int]*list.List)}}/** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */func (this *RandomizedCollection) Insert(val int) bool {	li, ok := this.pos[val]	if !ok {		li = list.New()		this.pos[val] = li	}	ele := li.PushBack(this.size)	this.nums = append(this.nums, pair{val, ele})	this.size++	return !ok}/** Removes a value from the collection. Returns true if the collection contained the specified element. */func (this *RandomizedCollection) Remove(val int) bool {	li, ok := this.pos[val]	if !ok {		return false	}	idx := li.Remove(li.Front()).(int)	this.size--	this.nums[idx] = this.nums[this.size]	this.nums[idx]._2.Value = idx	this.nums = this.nums[:this.size]	if li.Len() == 0 {		delete(this.pos, val)	}	return true}/** Get a random element from the collection. */func (this *RandomizedCollection) GetRandom() int {	return this.nums[rand.Intn(this.size)]._1}/** * Your RandomizedCollection object will be instantiated and called as such: * obj := Constructor(); * param_1 := obj.Insert(val); * param_2 := obj.Remove(val); * param_3 := obj.GetRandom(); */
 |