给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例 1:

**输入:**nums = [1,2,0]
**输出:**3
**解释:**范围 [1,2] 中的数字都在数组中。

示例 2:

**输入:**nums = [3,4,-1,1]
**输出:**2
**解释:**1 在数组中,但 2 没有。

示例 3:

**输入:**nums = [7,8,9,11,12]
**输出:**1
**解释:**最小的正数 1 没有出现。

提示:

1 <= nums.length <= 10(5)

-2(31) <= nums[i] <= 2(31) - 1

求没出现的最小正整数

也就是从1开始依次判断在不在数组中

核心思想是把数字和下标对应

即我们可以把1存在0号索引处,2存在1号索引处。。。

之后再遍历一次找到不符合对应关系的索引即可

对于非正数直接跳过

对于大于size的直接跳过,因为在交换过程中他们会慢慢移到数组末尾

已经就位的元素直接跳过,目的索引已经被对应好(重复元素)直接跳过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
int firstMissingPositive(vector<int> &nums) {
for (int i = 0; i < nums.size(); i++) {
while (nums[i] > 0 && nums[i] <= nums.size() && nums[i] != i + 1 &&
nums[nums[i] - 1] != nums[i]) {
swap(nums[i], nums[nums[i] - 1]);
}
}
for (int i = 0; i < nums.size(); i++) {
if (i + 1 != nums[i])
return i + 1;
}
return nums.size() + 1;
}
};