LeetCode in Kotlin

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 kotlin.random.Random

@Suppress("kotlin:S2245")
class RandomizedSet {
    private val list: MutableList<Int>
    private val map: MutableMap<Int, Int>

    /* Initialize your data structure here. */
    init {
        list = ArrayList()
        map = HashMap()
    }

    /* Inserts a value to the set. Returns true if the set did not already contain the specified element. */
    fun insert(`val`: Int): Boolean {
        if (map.containsKey(`val`)) {
            return false
        }
        map[`val`] = list.size
        list.add(`val`)
        return true
    }

    /* Removes a value from the set. Returns true if the set contained the specified element. */
    fun remove(`val`: Int): Boolean {
        if (!map.containsKey(`val`)) {
            return false
        }
        val swap1 = map[`val`]!!
        val swap2 = list.size - 1
        val val2 = list[swap2]
        map[val2] = swap1
        map.remove(`val`)
        list[swap1] = val2
        list.removeAt(list.size - 1)
        return true
    }

    /* Get a random element from the set. */
    fun getRandom(): Int {
        return list[Random.nextInt(list.size)]
    }
}

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