题目
给你一个未排序的整数数组 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 <= 105-231 <= nums[i] <= 231 - 1
题解
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
for (int i = 0; i < n; i++) {
// nums[i] 在 [1,n],并且 nums[i] 没有在正确位置上,就交换
while (nums[i] >= 1 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
int temp = nums[nums[i] - 1];
nums[nums[i] - 1] = nums[i];
nums[i] = temp;
}
}
// 查找第一个不满足 nums[i] = i+1
for (int i = 0; i < n; i++) {
if (nums[i] != i + 1) {
return i + 1;
}
}
// 1~n全部存在
return n + 1;
}
}
思路
要求:时间 O(n),空间 O(1)
对于长度为 n 的数组,答案一定落在 1,n+1 之间。
- 如果 1~n全部出现,答案就是 n+1
- 否则答案就是 1~n 中第一个没出现的数
我们把数值 x 放到下标 x‑1 的位置上。例如数字1放到索引0,数字2放到索引1。最后遍历数组,第一个不满足 nums[i] == i+1 的位置,i+1就是答案。