题目简介:
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例 1:
1 | 输入: [1,2,0] |
示例 2:
1 | 输入: [3,4,-1,1] |
示例 3:
1 | 输入: [7,8,9,11,12] |
提示:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。
思路:
由于时间复杂度为O(n)
,空间复杂度为O(1)
,所以不能使用简单的哈希表或排序等方法。
所以我们使用置换的方法,在遍历数组时,将nums[i]
放置到nums[nums[i] - 1]
的位置上,比如nums[i] = 3
就放置到nums[2]
,即nums[2] = 3
。
这样子最后的结果数组便为[1,2,3,4,...,nums.size()]
。只要nums[i] != i + 1
,那么这个数就是缺失的数,返回即可。
在置换时需要考虑以下几点:
- 首先
0 < nums[i] <= nums.size()
,也就是1 ~ nums.size()
的范围,才可以进行置换。 - 若
nums[i] == nums[nums[i] - 1]
,即该位置上已放置了正确的数字,那么不必再置换,否则会造成死循环,一直置换下去。
代码如下:
1 | class Solution { |