LeetCode-in-Go

380. Insert Delete GetRandom O(1)

Medium

Implement the RandomizedSet class:

You must implement the functions of the class such that each function works in average O(1) time complexity.

Example 1:

Input

["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"] 
[[], [1], [2], [2], [], [1], [2], []]

Output: [null, true, false, true, 2, true, false, 2]

Explanation:

RandomizedSet randomizedSet = new RandomizedSet(); 
randomizedSet.insert(1); // Inserts 1 to the set. Returns true as 1 was inserted successfully. 
randomizedSet.remove(2); // Returns false as 2 does not exist in the set. 
randomizedSet.insert(2); // Inserts 2 to the set, returns true. Set now contains [1,2]. 
randomizedSet.getRandom(); // getRandom() should return either 1 or 2 randomly. 
randomizedSet.remove(1); // Removes 1 from the set, returns true. Set now contains [2]. 
randomizedSet.insert(2); // 2 was already in the set, so return false. 
randomizedSet.getRandom(); // Since 2 is the only number in the set, getRandom() will always return 2.

Constraints:

Solution

import (
	"math/rand"
)

type RandomizedSet struct {
	list []int
	dict map[int]int
}

func Constructor() RandomizedSet {
	return RandomizedSet{
		list: make([]int, 0),
		dict: make(map[int]int),
	}
}

func (this *RandomizedSet) Insert(val int) bool {
	if _, exists := this.dict[val]; exists {
		return false
	}
	this.dict[val] = len(this.list)
	this.list = append(this.list, val)
	return true
}

func (this *RandomizedSet) Remove(val int) bool {
	if _, exists := this.dict[val]; !exists {
		return false
	}
	last := len(this.list) - 1
	lastVal := this.list[last]
	idx := this.dict[val]
	this.list[idx] = lastVal
	this.dict[lastVal] = idx
	this.list = this.list[:last]
	delete(this.dict, val)
	return true
}

func (this *RandomizedSet) GetRandom() int {
	return this.list[rand.Intn(len(this.list))] // NOSONAR
}