数组题目:645. 错误的集合、 697. 数组的度、 448. 找到所有数组中消失的数字、442. 数组中重复的数据 、41. 缺失的第一个正数

news2024/11/19 12:42:31

645. 错误的集合

思路:

我们定义一个数组cnt,记录每个数出现的次数。然后我们遍历数组,从1开始,如果cnt[i] == 0 那就说明这个是错误的数,如果 cnt[i] == 2,那就说明是重复的数。

代码:

class Solution {
    public int[] findErrorNums(int[] nums) {
        int n = nums.length;
        int[] cnts = new int[n + 1];
        for(int i : nums) cnts[i] ++;
        int[] ans = new int[2];
        for(int i = 1;i <= n; i++){
            if(cnts[i] == 0) ans[1] = i;
            if(cnts[i] == 2) ans[0] = i;
        }
        return ans;
    }
}

 697. 数组的度

思路:

题目说的度,是说元素出现的次数的最大值。但是又说最短连续子数组,那么我们就要知道数组的长度。我们定义一个Map,key 是数组里的数,value是一个数组,value[0]是指出现的次数,value[1]是指出现的第一次坐标,求数组的长度就用最后一次坐标减去第一次出现的坐标。

因为题目说nums.length 从1 开始,所以我们定义int[] Max = {1, 1}。然后遍历数组,如果MAP里没有记录,就存下对应的参数,如果出现过,就把value[0] + 1,然后和max数组对比。

  • 如果说value[0] > max[0],那就把value的信息更新到max
  • 如果说value[0] == max[0],那么就要看数组的长度

代码:

class Solution {
    public int findShortestSubArray(int[] nums) {
        // 1、我们需要知道某个数的出现次数
        // 2、要求最短连续数组,所以我们需要知道数组的长度
        // 3、需要记录的:次数、长度和数字本身
        // 4、长度可以由下表计算,保存初始下标
        // key :数, value[0] :出现的次数, value[1] :第一次下表
        Map<Integer, Integer[]> map = new HashMap<>();
        int[] max = {1, 1};
        for(int i = 0; i < nums.length; i++){
            if(!map.containsKey(nums[i])){
                map.put(nums[i],new Integer[] {1, i});
            }else{
                Integer[] cur = map.get(nums[i]);
                //出现次数+1
                cur[0] += 1;
                //如果出现的次数比max大,或者次数相同,但是数组长度更小,就更新max
                if(cur[0] > max[0] || cur[0] == max[0] && i - cur[1] + 1 < max[1]){
                    max = new int[] {cur[0], i - cur[1] + 1};
                }
            }
        }
        return max[1];
    }
}

 448. 找到所有数组中消失的数字

思路:

我们先遍历nums,如果  nums[i] == i + 1,那就说明该位置就是对应的数字。

然后遍历nums,如果nums[nums[i] - 1] == nums[i] ,那就说明他不是消失的数字。

如果我们遍历到有重复的数字,比如上面的3,而且nums[2] == 3,那我们就往后遍历。

遍历之后的结果:

nums:[1,2,3,4,3,2,7,8](注意题目中的2, 3)

然后我们再遍历一次nums,如果nums[i] != i + 1,那就说明他们是消失的数字

代码:

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> res = new ArrayList<>();
        int i = 0;
        while(i < nums.length){
            if(nums[i] == i + 1){
                i ++;
                continue;
            }
            int index = nums[i] - 1;
            if(nums[index] == nums[i]){
                i++;
                continue;
            }

            int tmp = nums[i];
            nums[i] = nums[index];
            nums[index] = tmp;
        }

        for(int j = 0; j < nums.length; j++){
            if(nums[j] != j + 1){
                res.add(j + 1);
            }
        }
        return res;
    }
}

442. 数组中重复的数据

思路:

我们遍历nums,遍历的每一个元素都变成|x|,然后把nums[|x| - 1]的数乘上-1。

再遍历一遍原数组,如果当前遍历的元素是负的,就说明他是重复的,那就说明|x|是重复的。

代码:

class Solution {
    public List<Integer> findDuplicates(int[] nums) {
        int n = nums.length;
        List<Integer> ans = new ArrayList<>();
        for(int i = 0; i < n; i++){
            int x = Math.abs(nums[i]);
            if(nums[x - 1] > 0){
                nums[x - 1] = -nums[x - 1];
            }else{
                ans.add(x);
            }
        }
        return ans;
    }
}

41. 缺失的第一个正数

思路:

方法1:

对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1,N+1] 中。如果再[1,N]中没有出现,那就说明是第N+1。

我们遍历数组,如果当前的数小于或者等于0,那就让他变成N+1,定义int x = nums[i],让nums[x - 1]乘上-1。

然后我们遍历数组,如果在[1,N]中有没有正数,那就说明是N+1, 如果有那就是第一个正数的坐标+1。

代码:

class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        for(int i = 0; i < n; i++){
            if(nums[i] <= 0) nums[i] = n + 1;
        }

        for(int i = 0; i < n; i++){
            int x = Math.abs(nums[i]);
            if(x <= n){
                nums[x - 1] = -Math.abs(nums[x - 1]);
            }
        }

        for(int i = 0; i < n; i++){
            if(nums[i] > 0){
                return i + 1;
            }
        }
        return n + 1;
    }

}

方式2:

通过置换,把对应的数字放到对应的坐标,如果当前的数nums[i] != i + 1,那就说明i+1是缺失的第一个。

class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        for(int i = 0; i < n; i++){
            while(nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]){
                int tmp = nums[nums[i] - 1];
                nums[nums[i] - 1] = nums[i];
                nums[i] = tmp;
            }
        }
        for(int i = 0; i < n; i++){
            if(nums[i] != i + 1){
                return i + 1;
            }
        }
        return n + 1;
    }
    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1252476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式虚拟机原理

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

【数据集】全网最全的常见已公开医学影像数据集

目录 一&#xff0c;极市医学数据集汇总 1.CT 医学图像 ​编辑 2.恶性与良性皮肤癌 3.白内障数据集 4.胸部 X 光图像&#xff08;肺炎&#xff09; 5.用于图像增强的内窥镜真实合成曝光过度和曝光不足帧 6.医学家 7.乳房组织病理学图像 8.皮肤癌 MNIST&#xff1a;HA…

芯片安全和无线电安全底层渗透技术

和传统网络安全不同&#xff0c;硬件安全、芯片安全、无线电安全属于网络底层安全的重要细分领域&#xff0c;是网络安全的真正基石&#xff0c;更是国家安全的重要组成部分&#xff0c;“夯实网络底层安全基础&#xff0c;筑牢网络强国安全底座”&#xff0c;是底网安全重要性…

上手 Promethus - 开源监控、报警工具包

名词解释 Promethus 是什么 开源的【系统监控和警报】工具包 专注于&#xff1a; 1&#xff09;可靠的实时监控 2&#xff09;收集时间序列数据 3&#xff09;提供强大的查询语言&#xff08;PromQL&#xff09;&#xff0c;用于分析这些数据 功能&#xff1a; 1&#xff0…

红外遥控实验

本章&#xff0c;我们将介绍 STM32F103 对红外遥控器的信号解码。STM32 板子上标配的红外接收 头和一个小巧的红外遥控器。我们将利用 STM32 的输入捕获功能&#xff0c;解码开发板标配的红外遥控 器的编码信号&#xff0c;并将编码后的键值在 LCD 模块中显示出来。 红外遥控技…

AI换脸教程

方法一、MJ换脸大法 1.点击这个网站添加一个机器人到自己的服务器 https://discord.com/oauth2/authorize?client_id1090660574196674713&permissions274877945856&scopebot 2. /saveid 回车选择你自己的照片&#xff0c;并且在名字框命名身份&#xff0c;回车 3.…

Cesium-terrain-builder编译入坑详解

本以为编译cesium-terrian-tools编译应该没那么难&#xff0c;不想问题重重&#xff0c;不想后人重蹈覆辙&#xff0c;也记录下点点滴滴。 目前网上存在的cesium代码版本主要有两个分支&#xff1a; 原始网站【不能生成layer文件&#xff0c;且经久不更新&#xff0c;使用gdal…

Kotlin学习——kt里面的函数,高阶函数 函数式编程 扩展函数和属性

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

【STM32】GPIO输出

1 GPIO简介 &#xff08;1&#xff09;GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口 &#xff08;2&#xff09;可配置为8种输入输出模式 &#xff08;3&#xff09;引脚电平&#xff1a;0V~3.3V&#xff0c;部分引脚可容忍5V&#xff08;可以输…

mysql8下载与安装教程

文章目录 1. MySQL下载2. MySQL安装3. 添加环境变量4. 登录mysql 1. MySQL下载 以下两个网址二选一 官网&#xff1a;https://downloads.mysql.com/archives/community/阿里云镜像&#xff1a;https://mirrors.aliyun.com/mysql/?spma2c6h.13651104.d-5173.5.2e535dc8shSjIl…

centos7搭建ftp服务

一、安装 yum -y install vsftpd vi /etc/vsftpd/vsftpd.conf二、编辑配置文件 /etc/vsftpd/vsftpd.conf 内容如下 #是否允许匿名&#xff0c;默认no anonymous_enableNO#这个设定值必须要为YES 时&#xff0c;在/etc/passwd内的账号才能以实体用户的方式登入我们的vsftpd主机…

【Java程序员面试专栏 专业技能篇 】Java SE核心面试指引(四):Java新特性

关于Java SE部分的核心知识进行一网打尽,包括四部分:基础知识考察、面向对象思想、核心机制策略、Java新特性,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第四部分:Java新特性,子节点表示追问或同级提问 Java8新特性…

PyInstaller打包python程序为exe可执行文件

教程千千万&#xff0c;貌似我的window电脑就是打包不了&#xff0c;而且不同电脑的表现都不一致&#xff0c;很是奇怪。 文章目录 1 极简版1.1 生成文件spec详解1.2 是否变成一个exe主文件 2 虚拟环境打包3 其他打包需求3.1 加密打包3.2 Pyinstaller打包多个py文件为一个exe文…

代码随想录算法训练营第四十七天|198. 打家劫舍、213. 打家劫舍II、337. 打家劫舍III

LeetCode 198. 打家劫舍 题目链接&#xff1a;198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 第一次打家劫舍&#xff0c;来个简单一些的&#xff0c;无非就是偷了当前这家偷不了下一家&#xff0c;因此dp[n]代表&#xff0c;偷前n家的时候所能偷到的最高金额&#x…

区间预测 | Matlab实现BP-KDE的BP神经网络结合核密度估计多变量时序区间预测

区间预测 | Matlab实现BP-KDE的BP神经网络结合核密度估计多变量时序区间预测 目录 区间预测 | Matlab实现BP-KDE的BP神经网络结合核密度估计多变量时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.BP-KDE多变量时间序列区间预测&#xff0c;基于BP神经网络多…

rtsp点播异常出现‘circluar_buffer_size‘ option was set but it is xx

先说现象: 我使用potplay播放器来点播rtsp码流的时候可以点播成功&#xff0c;同事使用vlc和FFplay来点播rtsp码流的时候异常。 排查思路: 1.开始怀疑是oss账号问题&#xff0c;因为ts切片数据是保存在oss中的&#xff0c;我使用的是自己的oss账号&#xff0c;同事使用的是公司…

Kafka 如何实现顺序消息

版本说明 本文所有的讨论均在如下版本进行&#xff0c;其他版本可能会有所不同。 Kafka: 3.6.0Pulsar: 2.9.0RabbitMQ 3.7.8RocketMQ 5.0Go1.21github.com/segmentio/kafka-go v0.4.45 结论先行 Kafka 只能保证单一分区内的顺序消息&#xff0c;无法保证多分区间的顺序消息…

【数据结构】用C语言实现链队列(附完整运行代码)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.了解项目功能 在本次项目中我们的目标是实现一个链队列: 该链队列使用动态内存分配空间,可以用来存储任意数量的同类型数据. 队列结点(QNode)需要包含两个要素:数据域data,…

2017年4月10日 Go生态洞察:开发者体验工作组介绍

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

我好像发现了车载测试面试成功的秘籍

在汽车行业中&#xff0c;车载测试工程师扮演着至关重要的角色。他们负责确保汽车的各种系统和功能在各种条件下都能正常运行&#xff0c;以确保车辆的安全性、可靠性和性能。如果你梦想成为一名车载测试工程师&#xff0c;那么你可能需要准备好回答一些关键的面试问题。在本文…