Given an unsorted integer array, find the first missing positive integer.
For example,
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.
长度为n的数组,可连续放入正整数1~n,此题要求时间复杂度为O(n),空间复杂度为常数。
可以通过两次遍历数组来完成,第一次遍历数组,通过交换,使得数组nums[i] = i+1,nums[0]~nums[n-1]中放入1~n;第二次遍历数组,查找nums[i] != i+1,(i+1)缺失;若1~n都不缺失,则返回n+1
public class Solution {
public int firstMissingPositive(int[] nums) {
int i = 0;
int n = nums.length;
//第一次遍历数组,通过交换,使得数组nums[i] = i+1,nums[0]~nums[n-1]中放入1~n
//第二次遍历数组,nums[i] != i+1,(i+1)缺失;若1~n都不缺失,则返回n+1
while(i < n){
if( nums[i] >0 && nums[i] <= n && nums[i] != i+1 && nums[nums[i]-1] != nums[i]){
swap(nums,i,nums[i]-1);
}
else{
i++;
}
}
for(int j = 0;j < n;j++){
if(nums[j] != j+1){
return j+1;
}
}
return n+1;
}
private void swap(int[] nums,int i,int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}