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

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

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

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