41    求数组中缺失的第一个正数

该博客探讨了如何在未排序的整数数组中找到第一个缺失的正整数。通过算法解析,阐述了如何有效地遍历数组并找到缺失的数字,涉及到数组处理和数值分析的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                                                                                  点击此处返回总目录

 

【题目】

【分析】

假设数组的长度为4,数组最多放四个正数。那数组中没出现的最小正整数只能是1,2,3,4或者5。

 

要求时间复杂度为o(n),意思是可以通过1趟遍历,2趟遍历,3趟遍历...得到。

我们一般能想到的方法:

1. 首先排序,然后一趟查找。时间复杂度为nlogn,不行。

2. 从1开始查找,不行,时间复杂度为n2。

3. 异或操作,不行。

4. 另起一个数组或者Set,不行,空间复杂度为o(n)。

 

 

 

【方法一】

利用645题方法三。

通过负号来记录该位置有没有出现过正确的数。但是因为数组中有负数,所以要先处理一下。

我们的想法是遍历一遍数组,如果出现了1,则把第0位变成负数。如果出现了n,则把第n-1位变成负数。

所以,首先要把数组中的负数都处理掉,否则看到负数我们无法判断是本来是负数还是我们改成的负数。

处理成多少合适呢?如果处理成0,那么加上负号之后还是0,就没法判断了。所以,我们处理成了len+1。

 

把0也变成len+1也是同样的原因。

 

至于把大于len的数也变成了len+1,就是顺手做了,也可以不处理。

这样就变成了类似以下的数组:

[2,9,2,4,9,1,9,3]

剩下的就跟以前一样,如果遇到的数在[1,n]之间,就把相应位变成负的,做为标记。

 

 

代码:

 

结果:

 

 

 

【方法二】

利用题目  一个数组的元素为1~n,在o(n)的时间内对数组排序 的思想和延伸,将1-n的元素归位。

 

代码:

 

结果:

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值