给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 :
输入:nums = [1,2,0]
输出:3
:
输入:nums = [3,4,-1,1]
输出:2
输入:nums = [7,8,9,11,12]
输出:1
思路:
参考:26. 删除排序数组中的重复项【简单】,原地操作
- 如果数组中包含 x ∈[1,N],那么恢复后,数组的第 x−1 个元素为 x。如果数组中的数都大于N,即返回 1,如示例3
- 对数组进行一次遍历,对于遍历到的数 x=nums[i],如果 ∈[1,N],我们就知道 x 应当出现在数组中的 x−1 的位置,因此交换 nums[i] 和 nums[x−1],这样 x 就出现在了正确的位置。
- 在完成交换后,新的nums[i] 可能还在 [1, N] 的范围内,我们需要继续进行交换操作,直到x不属于 [1,N]。
- 最后再遍历一次,第一个 nums[i]!=i+1,就是结果。否则返回最后一个数 N+1
class Solution {
public int firstMissingPositive(int[] nums) {
int n=nums.length;
for(int i=0;i<n;i++){
int x=nums[i];// x 应当出现在数组中的 x - 1的位置
while(nums[i]>0 && nums[i]<=n && nums[i]!=nums[nums[i]-1]){//交换 x 和 nums[x−1]
int temp=nums[nums[i]-1];//交换不能反过来,会越界
nums[nums[i]-1]=nums[i];
nums[i]=temp;
// int temp=nums[i]; //比如[3,4,-1,1],i=0,nums[i]=3
// nums[i]=nums[nums[i]-1];//[-1,4,-1,1]
// nums[nums[i]-1]=temp;//nums[i]-1=-2
}
}
for(int i=0;i<n;i++){
if(nums[i]!=i+1) return i+1;
}
return n+1;
}
}