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

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

解题思路

1.首先我们梳理一下已有数据结构
1)map 删除、插入是O(1) ,如果需要随机获取,需要将map转换为list,然后可以实现随机获取,但是这样就是常数级操作
2)list 获取、插入是O(1) ,删除特定元素,需要查找到,才可以删除,但是这样就是常数级操作
2.由上面的已有数据结构分析,单一数据结构不太好解决此问题,可以配合用来解决此问题
3.用list来存储数据,map来存储数据与索引的对应关系,当要list进行删除时,将最后一个元素替换对应位置的元素,并且删除最后一个元素

解题遇到的问题

数据结构的合理运用

后续需要总结学习的知识点

map、set、list源码阅读&总结

##解法1
class RandomizedSet {
    List vaList = null;
    Map map = null;
    Random random = new Random();
    public RandomizedSet() {
        vaList = new ArrayList<>();
        map = new HashMap();
    }

    /**
     * bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。
     */
    public boolean insert(int val) {
        if (!map.containsKey(val)) {
            map.put(val, vaList.size());
            vaList.add(vaList.size(), val);
            return true;
        } else {
            return false;
        }
    }

    /**
     * bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。
     */
    public boolean remove(int val) {
        if (map.containsKey(val)) {
            // 获取val对应的索引值
            int index = map.get(val);
            int lastElement = vaList.get(vaList.size() - 1);
            // 将最后一个值,覆盖当前值,也就是删除了当前值
            vaList.set(index, lastElement);
            map.put(lastElement, index);
            // 移除最后一个值
            vaList.remove(vaList.size() - 1);
            map.remove(val);
            return true;
        } else {
            return false;
        }
    }

    /**
     * int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。
     */
    public int getRandom() {
        return vaList.get(random.nextInt(vaList.size()));
    }
}

你可能感兴趣的:(Leetcode-380 O(1) 时间插入、删除和获取随机元素)