Redian新闻
>
算法解题:缺失的最小正整数

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

公众号新闻
本文章来源于 Python 头条,作者综合格豆

问题难度:★★★☆☆

描述问题

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

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

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

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

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

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

分析问题

第一步:有序数组

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

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

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

第二步:核心问题

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

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

  • 否则,

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

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

第三步:实现细节

遍历数组

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

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

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

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

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

  3. 除了上述的其他情况:

    需要交换配位

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

    继续处理新的 元素

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

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

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

实现代码

def firstMissingPositive(nums):
    n = len(nums)
    for i in range(n):
        while 1 <= 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 循环。所以该算法的时间复杂度为

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

总结

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

OK,本篇讲解到此结束了,有喜欢的小伙伴请点赞收藏哦,有问题的读者请评论或留言。如果文章有任何技术性问题,欢迎大佬指点~


链接:https://mp.weixin.qq.com/s/tY8g21DQicRZSuCPIxe9_g

(版权归原作者所有,侵删)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
中国全面重开,澳旅游业阴霾难散!入境新规恐成最大阻碍,华女:缺乏科学依据马桶上解题夺冠全球竞赛,北大博士数分一度勉强及格,现是韦神隔壁最近的家常菜 2020-09极氪智能科技校招:智能驾驶规控算法工程师、智能驾驶感知算法工程师、车联网安全研究员等澜舟科技社招:算法实习生、算法开发工程师、产品实习生、资深前端开发工程师等北京内推 | 微软亚洲研究院智能多媒体算法组招聘算法实习生地平线社招:感知融合方向算法工程师、SLAM/3D算法工程师老人被困感染潮:缺药、延误、死亡我偷渡中的三个女人(七)【环球之旅】抢跑 越南-中国 越南+中文+越南<罗密欧朱丽叶>主演称自己被强迫裸体出镜,索赔5亿?!网友:缺钱了?强势的母亲+缺失的父亲=病态失控的孩子,不幸的不只他…【开心时刻】鸡同鸭讲话英文数学RUCSAC解题法,养成正确解题逻辑!宏景智驾校招:图像算法工程师、决策规划算法工程师、SLAM建图算法工程师等杭州内推 | 阿里巴巴CCO智能服务算法团队招聘NLP算法工程师 (社招P6/P7)菲尔兹奖得主再次突破数论难题:多少整数能写成2个有理数立方和?结论直接影响“千禧难题”之七千禧年大奖难题BSD猜想有了新进展:这些整数可以写成两个有理数的立方和Java 缺失的特性:扩展方法粤港澳大湾区数字经济研究院(福田)招聘:几何约束计算算法工程师、图形学算法研究员、研发项目经理等震惊!知名女星卖淫还债,交易时被捕,声泪俱下:缺钱花!离谱!Microsoft工程师用算法选人、Meta用算法裁员!日本年轻人超7成不愿晋升,价值感缺失的白领不配幸福?北京智源人工智能研究院招聘:算法研究员、算法研究工程师等强势的母亲+缺失的父亲=病态失控的孩子,不幸的不只有汪小菲“零点猜想”成立吗?张益唐在线为北大师生解题沙茶猪肝面线语文老师为什么要给学生讲新闻?思辨能力,是孩子不应缺失的素养一个整数+1,攻破了 Linux 内核!16岁上大学,20岁读博:某校颜值与实力并存的最小美女博士火了国漫数量“内卷”,优酷动漫的解题“新思路”北京/上海内推 | 小红书智能算法组招聘NLP/音乐/语音识别算法实习生首例算法引发人身权益案:交友平台算法误判用户为“杀猪盘”骗子,是否侵权?中山大学HCP Lab团队:AI解题新突破,神经网络推开数学推理大门除了刘慈欣,少年科幻小说还得看他的 ,多次入选中考阅读理解题……
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。