题目简介:
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例 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 { |