概述
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0]
输出:3
示例 2:
输入:nums = [3,4,-1,1]
输出:2
示例 3:
输入:nums = [7,8,9,11,12]
输出:1
- 提示:
1 <= nums.length <= 5 * 105
-231 <= nums[i] <= 231 - 1
思路
-
不通过方案:使用位数组的方式,将 nums[i] 的值映射到另外的数组 B 中,然后从第一位开始遍历 B 数组,B[i] = 0 的位置就是第一个缺少的正整数,由于 nums[i] 范围太大,导致 B 空间超过约定内存
-
找规律
规律:长度为 N 的数组,第一个不存在的正整数一定在 [1,N+1] 的区间内
因为若 [1,N] 的数字若都出现了,那么第一个不存在的正整数一定是 N+1。
所以只需要长度为 N+1 的数组 B,保存 nums 中 <= N && >= 0 的数即可,参考上面的位数组思路。
然后遍历 B,当 B 为 0 的时候的对应位置,就是第一个不存在的正整数。
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
int[] array = new int[nums.length+1];
for (int i = 0; i < nums.length; i++) {
if (nums[i] <= 0){
// 移走负数
nums[i] = n + 1;
}
}
for (int i = 0; i < n; i++) {
int num = nums[i];
if (num <= n){
array[num]++;
}
}
for (int i = 1; i <= n; i++) {
if (array[i] == 0){
return i;
}
}
return n+1;
}
}