当前位置: 首页 > news >正文

力扣labuladong——一刷day28

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、力扣380. O(1) 时间插入、删除和获取随机元素
  • 二、力扣710. 黑名单中的随机数


前言


常数时间删除-查找数组中的任意元素,且随机访问概率一致
如果想「等概率」且「在 O(1) 的时间」取出元素,一定要满足:底层用数组实现,且数组必须是紧凑的。 这样我们就可以直接生成随机数作为索引,从数组中取出该随机索引对应的元素,作为随机元素。 但如果用数组存储元素的话,插入,删除的时间复杂度怎么可能是 O(1) 呢? 可以做到!对数组尾部进行插入和删除操作不会涉及数据搬移,时间复杂度是 O(1)。 所以,如果我们想在 O(1) 的时间删除数组中的某一个元素 val,可以先把这个元素交换到数组的尾部,然后再 pop 掉。 交换两个元素必须通过索引进行交换对吧,那么我们需要一个哈希表 valToIndex 来记录每个元素值对应的索引。

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

class RandomizedSet {
    private List<Integer> nums;
    private Map<Integer, Integer> valToIndex;

    public RandomizedSet() {
        nums = new ArrayList<>();
        valToIndex = new HashMap<>();
    }
    
    public boolean insert(int val) {
        if(valToIndex.containsKey(val)){
            return false;
        }
        nums.add(val);
        valToIndex.put(val,nums.size()-1);
        return true;
    }
    
    public boolean remove(int val) {
        if(!valToIndex.containsKey(val)){
            return false;
        }
        int deleteIndex = valToIndex.get(val);
        int curIndex = nums.size()-1;
        Collections.swap(nums, deleteIndex, curIndex);
        valToIndex.put(nums.get(deleteIndex),deleteIndex);
        nums.remove(nums.size()-1);
        valToIndex.remove(val);
        return true;
    }
    
    public int getRandom() {
        return nums.get((int)(Math.random()*nums.size()));
    }
}

/**
 * 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();
 */

二、力扣710. 黑名单中的随机数

class Solution {
    int RZ;
    Map<Integer,Integer> map;

    public Solution(int n, int[] blacklist) {
        RZ = n - blacklist.length;
        map = new HashMap<>();
        for(int b : blacklist){
            map.put(b,666);
        }
        int last = n-1;
        for(int b : blacklist){
            if(b >= RZ){
                continue;
            }
            while(map.containsKey(last)){
                last --;
            }
            map.put(b,last);
            last --;
        }
    }
    
    public int pick() {
        int index = (int)(Math.random()*RZ);
        if(map.containsKey(index)){
            return map.get(index);
        }
        return index;
    }
}

/**
 * Your Solution object will be instantiated and called as such:
 * Solution obj = new Solution(n, blacklist);
 * int param_1 = obj.pick();
 */

相关文章:

  • Scala爬虫如何实时采集天气数据?
  • 暴力递归转动态规划(十五)
  • Linux常用命令:find、grep、vim、cat、less、more
  • 【 云原生 | K8S 】Kubernetes 概述
  • 第一章 Object-XML 映射简介
  • 金融信贷行业如何准确——大数据精准定位获客渠道
  • hutool ExcelUtil导出excel二级表头
  • UML/SysML建模工具更新(2023.10)(1)StarUML、Software Ideas Modeler
  • 【ubuntu20.04】win10安装ubuntu20.04双系统
  • 便捷Benchmark.sh 自动匹配workload(自用)
  • 算法工程师护城河
  • 利用Ansible实现批量Linux服务器安全配置
  • PanNet: A deep network architecture for pan-sharpening(ICCV 2017)
  • 有关队列内存超限问题bfs()(待解决)
  • 在 React 中选择使用 JSX 或 JavaScript
  • 2311d游戏引擎适配ios
  • 键盘win键无法使用,win+r不生效、win键没反应、Windows键失灵解决方案(亲测可以解决)
  • Linux基础开发工具之调试器gdb
  • scss 实用教程
  • 深入理解ClickHouse跳数索引
  • 体坛联播|水晶宫队史首夺足总杯,CBA总决赛爆发赛后冲突
  • 探秘多维魅力,长江经济带、珠三角媒体总编辑岳阳行启动
  • 布局50多个国家和地区,我国科技型企业孵化器数量全球第一
  • 俄谈判代表团已抵达土耳其,谈判预计在莫斯科时间10时左右开始
  • 普京批准俄方与乌克兰谈判代表团人员名单
  • 为何选择上海?两家外企提到营商环境、人才资源……