每日一题:缺失的第一个正数

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

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

示例 1:

输入:nums = [1,2,0]
输出:3
解释:范围 [1,2] 中的数字都在数组中。

示例 2:

输入:nums = [3,4,-1,1]
输出:2
解释:1 在数组中,但 2 没有。

示例 3:

输入:nums = [7,8,9,11,12]
输出:1
解释:最小的正数 1 没有出现。

提示:

  • 1 <= nums.length <= 105
  • -2^31 <= nums[i] <= 2^31 - 1

如果没有时间、空间复杂度要求,那么可以使用哈希表存储数组中出现的每一个元素,然后从正整数1开始枚举,直到找到不在表内的正整数即为所求。

但由于限制了时间复杂度O(n),使用常数级别的额外空间。也就是要求每个元素只遍历一次,且不能创建长度为n的数据结构。

所以使用考虑使用原地哈希。将哈希表存储在要哈希的数组中。

对于一个长度为 N 的数组,其没有出现的最小正整数只能在 [1,N+1] 中。

因此我们想要构建的目标数组形式如下:

  • 以[3,-1,4,1]为例。需要通过变换,让它变成[1,-1,3,4]的形式。
  • 考虑下标,nums[i]存储的值,就是i+1。而转换后第一个不满足这个条件的位置,就是缺少的第一个正整数。

第一步:i = 0,nums[i] = 3 != i+1,因此需要将nums[i]的值与nums[nums[i] - 1]交换。

第二步,i 仍然为0,因为当前位置没有被交换为1。继续交换。

此时,i = 0位置上的数已经符合要求了,i++。

这里如果起始数组里没有1这个数字,也就是说缺失的就是1会发生什么?

--- 在经过多次循环交换后,要么这个位置的值小于0,要么大于n+1,要么像后文所述,出现了重复数字。

所以要注意循环跳出条件。

这个例子中,到这一步其实就已经完成交换了,接下来就是遍历完所有的i,结束。

代码:

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

额外关注下nums[nums[i] - 1] != nums[i]这个循环跳出条件。

由于题目不保证一个数只出现一次,如果交换的两个数恰好相等,那么就会陷入死循环,所以加入这个条件跳出循环。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【youcans电力电子仿真 01】DC/DC变换电路

1. DC/DC变换电路 DC/DC变换电路是开关电源电路的核心&#xff0c;也是光伏逆变器的核心。本章介绍DC/DC变换电路的基本类型和电路原理&#xff0c;运用Matlab/Simulink对常用的非隔离型、隔离型变换电路进行建模和仿真分析。 1.1 DC/DC变换电路的类型 DC/DC变换电路也称为直…

【C语言】万字讲解函数栈帧的创建与销毁

目录 前言 一、什么是函数栈帧&#xff1f; 二、理解函数栈帧能解决什么问题呢 三、函数栈帧的创建和销毁解析 3.1 什么是栈&#xff1f; 3.2 认识相关寄存器和汇编指令 3.3 剖析函数栈帧的创建和销毁 3.3.1 esp寄存器与ebp寄存器的重要性 3.3.2 函数的调用堆栈 3.3.…

每日OJ题_完全背包②_力扣322. 零钱兑换

目录 力扣322. 零钱兑换 问题解析 解析代码 优化代码&#xff08;滚动数组&#xff09; 力扣322. 零钱兑换 322. 零钱兑换 难度 中等 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以…

Spring Task 定时任务(含结合cron 表达式)

目录 一、Spring Task的介绍 二、使用方法 2.1 配置类启用定时任务支持&#xff1a; 2.2 同步定时任务 ​编辑2.3 fixedRate 可以看出不能满足我们的日常需求 那如何让其开启异步呢&#xff08;开启多个线程工作&#xff09; 三、Spring Task 结合cron表达式 3.1 corn 表…

Web端Excel的导入导出Demo

&#x1f4da;目录 &#x1f4da;简介:✨代码的构建&#xff1a;&#x1f4ad;Web端接口Excel操作&#x1f680;下载接口&#x1f680;导入读取数据接口 &#x1f3e1;本地Excel文件操作⚡导出数据&#x1f308;导入读取数据 &#x1f4da;简介: 使用阿里巴巴开源组件Easy Exce…

还原matlab编辑器窗口和主窗口分开的问题

问题 matlab不知道早点的&#xff0c;点击运行后会弹出新的窗口&#xff0c;咋整都恢复不了 解决方案 首先&#xff0c;在编辑器窗口下&#xff0c;按ctrlshiftD&#xff0c;此时编辑器窗口和主窗口就合并了&#xff0c;问题解决。

MySQL-多表查询:多表查询分类、SQL99语法实现多表查询、UNION的使用、7种SQL JOINS的实现、SQL99语法新特性、多表查询SQL练习

多表查询 1. 一个案例引发的多表连接1.1 案例说明1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3 案例分析与问题解决 2. 多表查询分类讲解分类1&#xff1a;等值连接 vs 非等值连接等值连接非等值连接 分类2&#xff1a;自连接 vs 非自连接分类3&#xff1a;内连接…

DDoS攻击包含哪些层面?如何防护?

DDoS攻击&#xff08;分布式拒绝服务攻击&#xff09;是一种通过向目标服务器发送大量流量或请求&#xff0c;以使其无法正常工作的网络攻击手段。DDoS攻击涉及多个层面&#xff0c;在实施攻击时对网络基础架构、网络协议、应用层等进行攻击。下面将详细介绍DDoS攻击的层面。 1…

2024-5.python重要数据类型

重要数据类型 列表数据类型 在实际开发中&#xff0c;经常需要将一组&#xff08;不只一个&#xff09;数据存储起来&#xff0c;以便后边的代码使用。列表就是这样的一个数据结构。且列表是Python中最基本也是最常用的数据结构之一。 什么是数据结构呢&#xff1f; 通俗来讲…

python基于文件操作,2024年最新vue项目实战案例

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

C 排序算法

冒泡排序 冒泡排序&#xff08;英语&#xff1a;Bubble Sort&#xff09;是一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序&#xff08;如从大到小、首字母从A到Z&#xff09;错误就把他们交换过来。 过程演示&…

linux查看网络连接数

目录 netstat top netstat 1.netstat查看当前主机上网络连接信息&#xff0c;端口号&#xff0c;pid,程序名等等 #直接查看 netstat -anp #一般使用的时候&#xff0c;可能要筛选 #比如8080端口是否被占用 netstat -anp | grep 8080 #minio服务占用了那些端口 netstat -anp …