LeetCode - 380. Insert Delete GetRandom O(1) 常数时间插入、删除和获取随机元素

发布于 2024-09-06 22:36:41 字数 3952 浏览 12 评论 0

题目

HashMap + List 实现

解析:

  • 准备一个 HashMap 和一个 List 容器, HashMap 存放 valindex 的映射, List 容器中存放 val 集合;
  • insert() : 将 val 插入 List ,并加 <val, val 在 List 对应的索引> 放入 HashMap
  • remove() : 先获取要移除的值 valindex ,记为 removeIndex ,然后取 List 中的最后一个元素,记为 lastVal ,然后执行 valIndexMap.put(lastVal, removeIndex);vals.set(removeIndex, lastVal); 也就是将最后一个元素放到要删除的位置。 最后在两个容器中移除要删除的元素即可;
  • getRandom() : 在 List 中随机取一个元素即可;

class RandomizedSet {

    private HashMap<Integer, Integer>valIndexMap; // val -> index
    private ArrayList<Integer> vals;

    public RandomizedSet() {
        valIndexMap = new HashMap<>();
        vals = new ArrayList<>();
    }

    public boolean insert(int val) {
        if(valIndexMap.containsKey(val))
            return false;
        valIndexMap.put(val, vals.size());
        vals.add(val);
        return true;
    }

    public boolean remove(int val) {
        if(!valIndexMap.containsKey(val)) // doesn't exit, return false;
            return false;

        int removeIndex = valIndexMap.get(val);
        Integer lastVal = vals.get(vals.size()-1);
        
        valIndexMap.put(lastVal, removeIndex); // put the lastVal to the removeIndex position
        vals.set(removeIndex, lastVal); // update vals

        valIndexMap.remove(val);
        vals.remove(vals.size() - 1);
        
        return true;
    }

    public int getRandom() {
        if(vals.size() == 0)
            throw new RuntimeException();
        int randomIndex = (int)(Math.random() * vals.size());
        return vals.get(randomIndex);
    }
}

两个 HashMap 实现

这个和上面那个也是类似的:

  • 通过一个 size 变量来维护这个容器的容量;
  • 然后要增加一个 index -> val 的容器,这个就是替代了那个 List ,可以通过 index 来获取 val
  • 主要的思想还是通过将最后一个元素( size - 1 ) 放到删除元素的位置( removeIndex );
class RandomizedSet {

    private HashMap<Integer, Integer>valIndexMap; // val -> index 
    private HashMap<Integer, Integer>indexValMap; // index -> val 
    private int size;
    
    public RandomizedSet() {
        valIndexMap = new HashMap<>();
        indexValMap = new HashMap<>();
        size = 0;
    }
    
    public boolean insert(int val) {
        if(valIndexMap.containsKey(val))
            return false;
        valIndexMap.put(val, size);
        indexValMap.put(size++, val);
        return true;
    }
    
    public boolean remove(int val) {
        if(!valIndexMap.containsKey(val)) // doesn't exit, return false;
            return false;
        int removeIndex = valIndexMap.get(val);  // get the index of deleteVal 
        int lastIndex = --size;             // the last element's index
        
        Integer lastVal = indexValMap.get(lastIndex);
        
        valIndexMap.put(lastVal, removeIndex);  
        indexValMap.put(removeIndex, lastVal);
        
        // remove val and the lastIndex
        valIndexMap.remove(val);
        indexValMap.remove(lastIndex); 
        return true;
    }
    
    public int getRandom() {
        if(size == 0)
            throw new RuntimeException();
        int randomIndex = (int)(Math.random() * size);
        return indexValMap.get(randomIndex);
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

软糖

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

内心激荡

文章 0 评论 0

JSmiles

文章 0 评论 0

左秋

文章 0 评论 0

迪街小绵羊

文章 0 评论 0

瞳孔里扚悲伤

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文