LeetCode 41. 缺失的第一个正数 | Python
2021-05-03 10:27
标签:shadow 时间复杂度 就是 恢复 组元 class miss 位置 并且 题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/first-missing-positive 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。 示例 1: 示例 2: 示例 3: 提示: 思路:交换 因为题目中要求【算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间】。 如果没有这样的限制,那么可以使用哈希表的方法: 但是仔细审题之后,会发现,因为题目所给的数组是没有经过排序的。那么如果将所给的数组进行恢复,到时候遍历查看即能找到缺失的正数。 在给定的数组中,我们需要找的整数一定是落在 [1, n+1] (n 表示数组长度) 这个区间。但是 n + 1 并不用求,因为当前面 n 个数不满足时,要求的自然就是 n+1。 我们看示例 2: 在这个例子当中,我们将其恢复,那么数组最终是这样的:[1, -1, 3, 4],这样我们就可以发现,数组中缺失的就是就是数字 2。 那么现在的问题即是如何进行恢复。大致的思路是这样的:将 1 放到索引为 0 的位置上,2 放到索引为 1 的位置上,依次类推。 也即是说,设当前遍历的元素为 a,也就是说 a = nums[i],如果 a 落在 [1, n],根据上面的思路,那么 a 应该落在索引为 在这里需要注意防止陷入死循环。如果 a 本来就在正确的位置上时,上面的方法将会一直交换下去。所以在这里要注意,当元素出现在正确的位置上时,不需要交换跳过,直接下一个元素。 具体的代码实现如下。 文章原创,觉得写得还可以,欢迎关注点赞。微信公众号《书所集录》同步更新,同样欢迎关注点赞。 LeetCode 41. 缺失的第一个正数 | Python 标签:shadow 时间复杂度 就是 恢复 组元 class miss 位置 并且 原文地址:https://www.cnblogs.com/yiluolion/p/13199227.html41. 缺失的第一个正数
题目
输入: [1,2,0]
输出: 3
输入: [3,4,-1,1]
输出: 2
输入: [7,8,9,11,12]
输出: 1
解题思路
输入: [3,4,-1,1]
输出: 2
a-1
的位置。这个时候,交换 nums[i]
和 nums[a-1]
,那么 a 就会落在正确的位置。但是这里交换位置后的元素如果还在 [1, n] 的范围内,还需要继续进行交换操作,直到 a 不再落在 [1, n]。具体的过程如下图所示:代码实现
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
length = len(nums)
for i in range(length):
# 这里判断元素是否落在 [1, n],判断是否落在正确的位置
# 注意:防止进入死循环,当元素刚好落在正确位置,直接跳过,判断下个元素
while 1
实现结果
总结
文章标题:LeetCode 41. 缺失的第一个正数 | Python
文章链接:http://soscw.com/index.php/essay/81752.html