https://leetcode-cn.com/probl...python
给定正数数组 nums,返回数组中没有的最小的一个正整数。算法
要求:时间复杂度 O(n),空间复杂度 O(1)数组
这个题目的巧妙之处在于利用了输入的数组作标记,这样省去了使用额外空间,从而实现了 O(1) 的空间复杂度。code
关键点是:设数组长度为 n,那么答案必定在 [1, n+1] 之中。这是显而易见,由于 nums 里只有 n 个数,不可能出现 [1, n+1] 里的全部数字。排序
若是想实现 O(n) 的时间复杂度,只能遍历,不能排序,这里的方法是leetcode
处理特殊状况,若是 1 再也不 nums 里,答案天然是 1。不然:get
首先除掉数组中 [1, n+1] 之外的数,由于他们根本不会影响结果,干脆把这些数都写成 1。博客
而后,nums 里只有正数了,并且值在 [1, n] 以内。咱们遍历数组,对于数组里每一个数字,令 nums 对应的第这个位置的数变成负数。就把全部数的位置标记出来了,至关于用了一个桶排序算法。it
而后再遍历一下,第一个不是负数的位置就是缺失的数了。io
这里须要特殊处理 n,由于 n 会越界,干脆用位置 0 表明 n,或者也能够把全部数统一减一。
class Solution: def firstMissingPositive(self, nums: List[int]) -> int: if 1 not in nums: return 1 n = len(nums) for i in range(n): if nums[i] > n or nums[i] <= 0: nums[i] = 1 for i in range(n): a = abs(nums[i]) if a == n: nums[0] = -abs(nums[0]) else: nums[a] = -abs(nums[a]) for i in range(2, n): if nums[i] > 0: return i return n if nums[0] > 0 else n+1
欢迎来个人博客: https://codeplot.top/
个人博客刷题分类:https://codeplot.top/categori...