给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
进阶:你可以实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案吗?
示例 1
输入:nums = [1,2,0]
输出:3
示例 2:
输入:nums = [3,4,-1,1]
输出:2
其实如果没有规定时间复杂度和空间复杂度的话,so easy。但问题就是规定了复杂度。这该怎么办呢?也简单,我们可以从数字本身的取值范围来看。遍历数组,如果一个数x在1–n之间,说明这个数对结果是有影响的,我们把它放到数组的 x-1 位置(下标从0开始)。否则的话,这个数对结果没有影响,直接跳过。
本次遍历结束后,做第二次遍历,只要 nums[i] != i + 1。说明这个数字并没有出现过,那么它就是最小正整数。如果全部遍历完后还没有返回,则直接返回 n + 1。
class Solution {
public int firstMissingPositive(int[] nums) {
int len = nums.length;
for (int i = 0; i < len; ++i) {
while (nums[i] > 0 && nums[i] <= len && nums[nums[i] - 1] != nums[i]) {
int tp = nums[i];
nums[i] = nums[nums[i] - 1];
nums[tp - 1] = tp;
}
}
for (int i = 0; i < len; ++i) {
if (nums[i] != i + 1) {
return i + 1;
}
}
return len + 1;
}
}