First Missing Positive
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.Your algorithm should run in O(n) time and uses constant space.
Solution1
- O(1)的space要去,则要么是in-place的方法要么是用有限的几个变量能够解决,这里是用in-place的方法。如下:
public class Solution {
public int firstMissingPositive(int[] nums) {
int result = 1;
for(int i=0;i<nums.length;){
if(nums[i]>0&&nums[i]<=nums.length&&nums[i]!=i+1&&nums[nums[i]-1]!=nums[i]){
int temp = nums[i];
nums[i] = nums[temp-1];
nums[temp-1] = temp;
}else i++;
while(result<=nums.length&&result==nums[result-1]) result++;
if(result>nums.length) return result;
}
return result;
}
}
- 这里实际利用到了双指针,i用来遍历是一个指针,result作为结果也是一个指针,始终指向当前缺省的第一个正数。另外需要注意的是将正整数i存放在数组的下标i-1处。
Solution2
- 也可以不用两个指针,只用一个指针来解决问题。如下:
public class Solution {
public int firstMissingPositive(int[] nums) {
for(int i=0;i<nums.length;){
if(nums[i]>0&&nums[i]<=nums.length&&nums[i]!=i+1&&nums[nums[i]-1]!=nums[i]){
int temp = nums[i];
nums[i] = nums[temp-1];
nums[temp-1] = temp;
}else i++;
}
for(int i=0;i<nums.length;i++) if(nums[i]!=i+1) return i+1;
return nums.length+1;
}
}