力扣每日一题2022-04-13中等题:O(1)时间插入、删除和获取随机元素

@toc


题目描述

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


思路

哈希表+数组

因为要做到O(1)获取随机元素,所以使用数组实现这个功能。因为要O(1)实现删除和添加,因为数组中还需要遍历查找元素是否存在,所以时间复杂度为O(n),为了降到O(1)时间复杂度,可以使用哈希表实现查找。

Java实现
class RandomizedSet {
    /**
     * 数组实现随机获取元素,哈希表实现插入和删除时的查找
     */

    private List<Integer> nums;
    private Map<Integer, Integer> idxMap;
    private Random random;
    
    public RandomizedSet() {
        nums = new ArrayList<Integer>();
        idxMap = new HashMap<Integer, Integer>();
        random = new Random();
    }
    
    public boolean insert(int val) {
        if (!idxMap.containsKey(val)) {
            idxMap.put(val, nums.size());
            nums.add(val);
            return true;
        }
        return false;
    }
    
    public boolean remove(int val) {
        /**
         * 为了使得是O(1)时间复杂度,先将要删除的值位置与数组最后一个值交换,因为数组无序,所以并不影响结果,但是却能降到O(1)的时间复杂度
         */
        if (idxMap.containsKey(val)) {
            int idx = idxMap.get(val), lastVal = nums.get(nums.size()-1);
            idxMap.put(lastVal, idx);
            nums.set(idx, lastVal);
            idxMap.remove(val);
            nums.remove(nums.size()-1);
            return true;
        }
        return false;
    }
    
    public int getRandom() {
        int randomIdx = random.nextInt(nums.size());
        return nums.get(randomIdx);
    }
}

/**
 * Your RandomizedSet object will be instantiated and called as such:
 * RandomizedSet obj = new RandomizedSet();
 * boolean param_1 = obj.insert(val);
 * boolean param_2 = obj.remove(val);
 * int param_3 = obj.getRandom();
 */
Python实现
class RandomizedSet:

    def __init__(self):
        self.nums = []
        self.idxMap = dict()


    def insert(self, val: int) -> bool:
        if val not in self.idxMap:
            self.idxMap[val] = len(nums)
            self.nums.append(val)
            return True
        return False


    def remove(self, val: int) -> bool:
        if val in self.idxMap:
            lastVal, idx = self.nums[-1], self.idxMap[val]
            self.nums[idx] = lastVal
            self.idxMap[lastVal] = idx
            del self.idxMap[val]
            self.nums.pop()
            return True
        return False


    def getRandom(self) -> int:
        return choice(self.nums)



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

你可能感兴趣的:(leetcode每日一题,leetcode)