17.缺失的第一个正数
给你一个未排序的整数数组 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++){
//循环将所有num[i]>=1而且num[i]<=n的数都放到正确的位置,nums[i]放到下标为num[i]-1的位置
//如果 nums[i] 恰好与 nums[x−1] 相等,那么就会无限交换下去,此时跳出循环
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;
}
}
//在恢复后,数组应当有 [1, 2, ..., N] 的形式,但其中有若干个位置上的数是错误的,每一个错误的位置就代表了一个缺失的正数,以题目中的示例二 [3, 4, -1, 1] 为例,恢复后的数组应当为 [1, -1, 3, 4],我们就可以知道缺失的数为 2
for(int i=0;i<n;i++){
if(nums[i]!=i+1)return i+1;
}
//如果恢复后是[1,2...N],则缺失的数肯定是N+1
return n+1;
}
}

浙公网安备 33010602011771号