LeetCode刷题.15(哈希表与计数排序解决41. 缺失的第一个正数)

news2025/2/25 19:14:04

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例 1:

输入:nums = [1,2,0]

输出:3

示例 2:

输入:nums = [3,4,-1,1]

输出:2

示例 3:

输入:nums = [7,8,9,11,12]

输出:1

提示:

  • 1 <= nums.length <= 5 * 105
  • -231 <= nums[i] <= 231 - 1

解题思路: 

        首先,分析题目我们可以知道答案只会在1到正无穷范围内,因此可以不用管负整数和零,我们只需要从1开始逐个向后判断当前数是否存在即可,分为两个思路。

        思路1

        运用哈希表,将数组中所有元素放入哈希表中,再从1开始逐个递增数,依次判断是否在哈希表中,若哈希表中未存在,则返回该数:

示例 2举例:

        nums = [3,4,-1,1]

        将数组元素存入哈希表中,哈希表中元素:<-1,1,3,4>

        从1开始循环递增:

        i=1-->  哈希表中是否存在"1"        true

        i=2-->  哈希表中是否存在"2"        false        不存在,说明"2"即为确实的第一个正整数,结束循环并且返回2即可

代码实现1:

        

class Solution {
    public int firstMissingPositive(int[] nums) {
        //创建哈希表
        Set<Integer> hs=new HashSet<>();
        //遍历数组元素放入哈希表
        for(int x=0;x<nums.length;x++){
            hs.add(nums[x]);
        }
        int x;
        //从1开始逐个递增遍历,返回第一个哈希表里不存在的值
        for(x=1;;x++){
            if(!hs.contains(x)){
                break;
            }
        }
        return x;
    }
}

       

由上图的执行用时与内存消耗来看,该思路可行,但不是最优解,因此我们可以尝试用第二个方法

        思路2:

        利用计数排序方法解决该问题,首先我们要知道,若数组长度为5,则第一个缺失数只可能在1到6之间,因此我们可以设定一个长度为6的数组来保存数字1-6出现的次数,若未出现过则为零,返回从下标为1开始的第一个元素为零的数组下标,若都存在,则说明数组长度为第一缺失数,返回数组长度。

示例 1举例: 

        nums = [1,2,0]

        将nums数组中元素对应到arr数组的下标,arr[nums[i]]++

        如此做则数组arr:       <1,1,1,0>

        从arr数组下标为1开始向后逐个遍历:

        arr[1]=1 > 0       已存在

        arr[2]=1  > 0      已存在

        arr[3]=0  = 0      不存在        因此返回数组下标,即3

        

还有一个问题,若是nums数组有元素大于该长度怎么办?

        很简单,加个判断,因为我们已经知道第一个缺失数范围只会在1到arr数组长度之间,因此,大于这些的数目我们就不考虑,只需记录小于的即可。

代码实现2:

class Solution {
    public int firstMissingPositive(int[] nums) {
        //创建数组
        int missingnums[]=new int[nums.length+1];
        //若nums数组元素在missingnums数组下标范围内,则该下标值+1
        for(int x=0;x<nums.length;x++){
            if(nums[x]>0&&nums[x]<missingnums.length) missingnums[nums[x]]+=1;
        }
        //返回值为零的下标
        for(int x=1;x<missingnums.length;x++){
            if(missingnums[x]==0) return x;
        }
        //若所有下标值不为零,返回最后一个下标的下一个,即数组的长度
        return missingnums.length;
    }
}

        

        

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

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

相关文章

MCS-51---串行通信的特点

目录 一.同步通信和异步通信 1.异步通信 2.同步通信 二.串行通信的方式 1.单工 2.半双工 3.全双工 三.串行通信的速率 四.MCS-51单片机结构 五.串行口的控制 1.串行口控制寄存器(SCON) 2.电源控制寄存器(PCON) 六.波特率的设计 七.串行口的工作方式 1.方式0 2.…

NLP论文阅读记录 - WOS | ROUGE-SEM:使用ROUGE结合语义更好地评估摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结 前言 ROUGE-SEM: Better evaluation of summarization using ROUGE combin…

操作系统详解(5.1)——信号(Signal)的相关题目

系列文章&#xff1a; 操作系统详解(1)——操作系统的作用 操作系统详解(2)——异常处理(Exception) 操作系统详解(3)——进程、并发和并行 操作系统详解(4)——进程控制(fork, waitpid, sleep, execve) 操作系统详解(5)——信号(Signal) 文章目录 题目第一问第二问第三问 题目…

python24.1.14while循环

当条件结束时间未知时&#xff0c;while循环比for循环更合适 实践

Debian(Linux)局域网共享文件-NFS

NFS (Network File system) 是一种客户端-服务器文件系统协议&#xff0c;允许多个系统或用户访问相同的共享文件夹或文件。最新版本是 NFS-V4&#xff0c;共享文件就像存储在本地一样。它提供了中央管理&#xff0c;可以使用防火墙和 Kerberos 身份验证进行保护。 本文将指导…

docker-compose部署kafka、SASL模式(密码校验模式)

一.基础kafka部署 zookeeper&#xff0c;kafka&#xff0c;kafka-ui docker-compose.yml 注意点&#xff1a;192.168.1.20 是宿主机的ip version: "3" services:zookeeper:image: wurstmeister/zookeepercontainer_name: zookeeperrestart: alwaysports:- 2181:2…

未来的失业将是常态吗?

2024年&#xff0c;科技巨头谷歌、亚马逊都在本周宣布大规模裁员&#xff0c;影响到众多部门。此外&#xff0c;社交平台 Discord 表示将裁员 17%&#xff0c;游戏服务商 Unity Software 宣布将裁员 25%&#xff0c;语言学习应用程序 Duolingo 则称解雇了 10% 的正式职工&#…

使用 rosdep 管理依赖关系

什么是rosdep&#xff1f; rosdep是 ROS 的依赖管理实用程序&#xff0c;可以与 ROS 包和外部库一起使用。 是一个命令行实用工具&#xff0c;用于标识和安装依赖项以生成或安装包。 在以下情况下&#xff0c;可以调用或调用它&#xff1a;rosdep 构建工作区并需要适当的依赖项…

关于CodeReview的一些实践和思考

在日常开发中&#xff0c;Code Review 的重要性日益凸显。它不仅有助于提升代码质量&#xff0c;还促进了团队成员之间的知识共享和技能提升。本文将主要聚焦于 Code Review&#xff0c;分享在这个过程中的一些心得和思考。 CodeReview常用到的一些术语 之前看到公司的大佬经…

ssm基于Java的众惠商城的设计与实现论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统用户购物信息管理难度大&#xff0c;容错率低&#xff0c…

Python基础知识:整理14 利用pyecharts生成地图

1 地图可视化的基本使用 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts # 准备地图对象 map Map()# 准备数据 data [("北京市", 8), ("上海市", 99), ("广州省", 199), ("重庆市", 400), ("…

【Python学习】Python学习18- 方法OS 文件/目录方法

目录 【Python学习】Python学习17- File方法 前言os.access()语法&#xff1a; os.chdir(path)语法 os.chflags(path, flags)语法 os.chmod(path, mode)os.chown(path, uid, gid)os.chroot(path)os.close(fd)os.unlink(path)os.popen(command[, mode[, bufsize]])os.read(fd, …

【数据开发】大型离线数仓OLAP数据开发指南(目录)

文章目录 1、什么离线数仓OLAP2、OLAP数仓建设3、OLAP数仓开发指南 1、什么离线数仓OLAP 离线数仓OLAP&#xff08;Online Analytical Processing&#xff09;是一种数据分析技术&#xff0c;它通过对离线数据仓库中的数据进行分析&#xff0c;为企业提供决策支持的数据分析服…

瑞_Java开发手册_(五)MySQL数据库

文章目录 (一) 建表规约(二) 索引规约(三) SQL 语句(四) ORM 映射附&#xff1a;雪花算法&#xff08;Java&#xff09; &#x1f64a;前言&#xff1a;本文章为瑞_系列专栏之《Java开发手册》的MySQL数据库篇&#xff0c;主要介绍建表规约、索引规约、SQL语句、ORM映射。由于博…

Http协议简述

目录 HTTP-概述 2.1.1 介绍 2.2.2 特点 2.2 HTTP-请求协议 2.3 HTTP-响应协议 2.3.1 格式介绍 2.3.2 响应状态码 HTTP-概述 2.1.1 介绍 HTTP&#xff1a;Hyper Text Transfer Protocol(超文本传输协议)&#xff0c;规定了浏览器与服务器之间数据传输的规则。 http是互联…

牛刀小试---二分查找(C语言)

题目&#xff1a;在给定的升序数组中查找指定的数字n&#xff0c;并输出其下标 代码举例&#xff1a; #include <stdio.h> int main() {int arr[] { 1,2,3,4,5,6,7,8,9,10 };//给定的升序数组int left 0;//定义左下标int right sizeof(arr) / sizeof(arr[0]) - 1;//…

.NET开源免费、企业级、可商用内容管理系统 - SSCMS

前言 今天给大家推荐一款基于.NET Core开源、企业级、可商用、能够以最低的成本、最少的人力投入在最短的时间内架设一个功能齐全、性能优异、规模庞大并易于维护的内容管理系统&#xff1a;SSCMS。 系统官方介绍 SSCMS 内容管理系统基于微软 .NET Core 平台开发&#xff0c…

YOLOv5源码中的参数超详细解析(7)— yolo.py

前言:Hello大家好,我是小哥谈。YOLOv5是一种先进的目标检测算法,它可以实现快速和准确的目标检测。yolo.py是YOLOv5项目中的一个Python文件,用于实现目标检测算法。该文件包含了YOLOv5模型的定义、训练和推理过程。本节课就结合源码对yolo.py文件进行逐行解析~!🌈 前期…

【Linux】线程池实现

&#x1f4d7;线程池实现&#xff08;单例模式&#xff09; 1️⃣线程池概念2️⃣线程池代码样例3️⃣部分问题与细节&#x1f538;类成员函数参数列表中隐含的this指针&#x1f538;单例模式&#x1f538;一个失误导致的bug 4️⃣调用线程池完成任务 1️⃣线程池概念 线程池是…

树莓派ubuntu22桌面配置(一)

烧录系统至树莓派 下载系统&#xff1a;https://ubuntu.com/download/raspberry-pi 选择合适的版本下载 镜像安装器安装&#xff1a;终端输入&#xff1a; sudo snap install rpi-imager 打开镜像安装器&#xff0c;按照需求选择树莓派版本与要写入的系统还有安装的u盘 方案…