0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

算法解题:缺失的最小正整数

马哥Linux运维 来源:Python头条 作者:综合格豆 2022-12-06 14:33 次阅读

描述问题

问题:给定一个任意无序的整数数组 ,请返回一个在数组中没有出现的最小正整数。

限制:时间复杂度为 ,空间复杂度为 。

示例 1
输入:nums = [3, 1, 2, 4]
输出:5
描述:1、2、3、4 都在数组中,因此 5 是没有出现在数组中的最小正整数。

示例 2
输入:nums = [-3, 1, 0, 4]
输出:2
描述:略

示例 3
输入:nums = [6, 8, 7, 8]
输出:1
描述:略

请没做过此题的读者先思考片刻......

分析问题

第一步:有序数组

如果要求返回数组中存在的最小正整数,则很容易。仅遍历一次,并用一个变量记住当前的最小正整数即可。但是题目的要求是返回数组中缺失的最小正整数,这样我们必须处理无序数组,使其按照某种方式有序才行。如果数组有序,则仅需要最多一次遍历数组( 次比较)就能完成任务。

说到数组有序,首先会想到排序算法。处理一般排序的最高效算法就要属快速排序和归并排序了。但很遗憾,它们的平均时间复杂度都是 (超出题目的限制)。

还有更高效的排序算法么?当然有啦,正是用于整数的计数排序算法。其时间复杂度正为 。但是,计数排序的空间复杂度要视数组元素(整数)取值范围而定,而整数的范围区间已经达到了几十亿。这很显然不能满足空间复杂度 的限制。

第二步:核心问题

继续思考我们会发现一个重要的问题,也是该题目的核心所在,即缺失最小正整数 的取值范围是 。

如果数组为 [1, 2, 3,..., n-1, n],则 ,此时值最大。

否则,。

这一步是解决整个问题的最关键所在,也就是说我们可以将数组 中的大小在 范围的元素在长度为 的数组中进行有序排列。而数组 的长度刚好为 ,因此我们就可以不必申请额外空间,仅在原数组上对这些元素进行排序了。

这个排序与计数排序很类似,只不过不需要在对应的位置上记录相同元素的个数。只需将数组中每个 放到 位置上。我们称每个满足 的元素为配位元素

第三步:实现细节

遍历数组 。

当遍历到某个索引 时,可能会有下述 3 种情况:

该元素无法在数组中配位, 或者 。此时无需做任何额外处理,只进行 i++。

d7136ce8-6e62-11ed-8abf-dac502259ad0.pngd725fa48-6e62-11ed-8abf-dac502259ad0.png

与该元素值相同的某个元素已是配位元素, 。此时可能会有下述两种情况(无论哪种情况,同样只需进行 i++):

该元素本身就是配位元素,。

d745aa32-6e62-11ed-8abf-dac502259ad0.png

该元素本身是非配位元素,。

d76a8f5a-6e62-11ed-8abf-dac502259ad0.png

除了上述的其他情况:

d78ccd2c-6e62-11ed-8abf-dac502259ad0.png
需要交换配位

此时交换 和 的值,其目的是用当前 的值给 配位。

d7b2a830-6e62-11ed-8abf-dac502259ad0.png
继续处理新的 元素

然后,(在 值保持不变的情况下)继续根据上述 3 种情况处理新的 元素。

直到遍历结束。对数组 元素的配位已处理完毕。

我们再次从头开始遍历数组 。如果到遇到一个不配位的元素(nums[i] != i+1),则缺失最小正整数为 ;如果直到遍历结束也没有不配位元素,则缺失最小正整数为 。

实现代码

deffirstMissingPositive(nums):
n=len(nums)
foriinrange(n):
while1<= nums[i] <= n and nums[i] != nums[nums[i]-1]:
            nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
    for i in range(n):
        if nums[i] != i+1:
            return i+1

    return n+1

复杂度分析

时间复杂度:在 Python 代码中,看似第 5 行是计算最密集的(嵌套循环),其所做的处理是交换两个元素以进行配位。由于数组的每个索引最多只会进行一次配位,因此此处代码最多被执行 次。另外还有两个 次 for 循环。所以该算法的时间复杂度为 。

空间复杂度:由于我们在原数组 上进行操作,因而没有额外的空间申请。所以该算法的空间复杂度为 。

总结

虽说本题实现的代码量并不多,但思考起来却不算容易。关键点就在于要想到使数组有序缺失最小正整数的范围。只要明确这两点,这个问题就会迎刃而解。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4478

    浏览量

    91302
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25688

原文标题:算法解题:缺失的最小正整数

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何用LabVIEW,将m随机分为n个数,且这n个数的和加起来等于m(所有的数均为大于零的正整数,m>n)

    如何用abVIEW将一个数m分为n份,这n份数加起来,等于m比如一个数是15,将其分为3份,这三份数为:6,2,76+2+7=15(即m=15,n=3的情况)分成的n份数,都是大于零的正整数或者有什么思路可以提供一下吗
    发表于 07-30 17:12

    正整数的连续奇偶拆分

    正整数n的一个拆分是指将n表示为一个或多个正整数的无序和。n的不同拆分方式数称为n的拆分数。给出了一个正整数n能拆分成连续奇数和连续偶数之和的充要条件,并求出了这两种
    发表于 05-28 11:22 11次下载

    按频率抽取的FFT算法

    按频率抽取的FFT算法一、算法原理设输入序列长度为N=2M(M为正整数,将该序列的频域的输出序列X(k)(也是M点序列,按其频域顺序的奇偶分解为越来越短的子序列,称为基2按频
    发表于 07-25 11:44 62次下载

    能见度与缺失分析的改进PageRank算法

    本文在对PageRank 进行分析的基础上,提出了基于链接能见度和缺失分析的改进PageRank算法,该算法根据链接不同特性赋予它不同的点击概率,同时分析了缺失率产生的原因并提出相关
    发表于 12-29 16:57 11次下载

    用C语言写的100行DES加密算法

    // Type—ENCRYPT:加密,DECRYPT:解密// 输出缓冲区(Out)的长度 >= ((datalen+7)/8)*8,即比datalen大的且是8的倍数的最小正整数// In 可以= Out,此时加/解密后将覆盖输入缓冲区(In)的内容/
    发表于 02-09 11:23 68次下载

    超长正整数的加法源代码

    超长正整数的加法源代码方法一:#include#include#includetypedef
    发表于 02-09 15:59 13次下载

    基于整数变换的数据隐藏新算法

    基于Harr小波变换(整数变换),提出了一种新型的差值扩展数据隐藏算法,传统的Tian算法遇到的问题是二重嵌入中用于变换的差值大幅减少,嵌入容量受到了很大制约,并且在固定
    发表于 12-23 16:00 0次下载

    整数的表示方法

    整数的表示方法   整数表示的数据的最小单位为1,可认为它是小数点定在数值最低位右面的一种数据。
    发表于 10-13 17:12 4059次阅读

    C语言教程之输出相对的最小整数

    C语言教程之输出相对的最小整数,很好的C语言资料,快来学习吧。
    发表于 04-22 17:45 0次下载

    C语言教程之相对的最小整数

    C语言教程之相对的最小整数,很好的C语言资料,快来学习吧。
    发表于 04-25 16:09 0次下载

    基于整数小波变换的鲁棒零水印算法

    基于整数小波变换的鲁棒零水印算法_曾文权
    发表于 01-03 15:24 0次下载

    rsa加密算法的安全性分析

    RSA算法是一个基于初等数论定理的公钥密码体制加密算法,它的实现过程为:选取2个大素数p与q,然后算出n=pq,φ(n)=n-p-q+1,再选取一个正整数e,使之满足(e,φ(n))=1,1《E《Φ(N);再求出
    发表于 12-10 11:59 2.4w次阅读

    基于距离最大化和缺失数据聚类的填充算法

    通过对基于K-means聚类的缺失值填充算法的改进,文中提出了基于距离最大化和缺失数据聚类的填充算法。首先,针对原填充算法需要提前输入聚类个
    发表于 01-09 10:56 0次下载
    基于距离最大化和<b class='flag-5'>缺失</b>数据聚类的填充<b class='flag-5'>算法</b>

    基于加性噪声的缺失数据因果推断

    推断数据间存在的因果关系是很多科学领域中的一个基础问题,然而现在暂时还没有快速有效的方法对缺失数据进行因果推断。为此,提出一种基于加性噪声模型下适应缺失数据的因果推断算法。该算法是基于
    发表于 01-14 16:06 0次下载

    非线性整数规划的遗传算法及MATLAB程序下载

    非线性整数规划的遗传算法及MATLAB程序下载
    发表于 06-15 10:55 11次下载