LeetCode in TypeScript

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

class RandomizedSet {
    private rand: () => number
    private list: number[]
    private map: Map<number, number>

    constructor() {
        this.rand = () => Math.floor(Math.random() * this.list.length) // NOSONAR
        this.list = []
        this.map = new Map()
    }

    insert(val: number): boolean {
        if (this.map.has(val)) {
            return false
        }
        this.map.set(val, this.list.length)
        this.list.push(val)
        return true
    }

    remove(val: number): boolean {
        if (!this.map.has(val)) {
            return false
        }
        const swap1 = this.map.get(val)!
        const swap2 = this.list.length - 1
        const val2 = this.list[swap2]
        this.map.set(val2, swap1)
        this.map.delete(val)
        this.list[swap1] = val2
        this.list.pop()
        return true
    }

    getRandom(): number {
        return this.list[this.rand()]
    }
}

/**
 * Your RandomizedSet object will be instantiated and called as such:
 * var obj = new RandomizedSet()
 * var param_1 = obj.insert(val)
 * var param_2 = obj.remove(val)
 * var param_3 = obj.getRandom()
 */

export { RandomizedSet }