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.
public class Solution {
public int firstMissingPositive(int[] nums) {
Arrays.sort(nums);
for(int i=0;i<nums.length;i++){
if(nums[i]==1){
int a=1;
for(int j=i;j<nums.length;j++){
if(j!=nums.length-1&&(nums[j]==nums[j+1]))
continue;
else if(nums[j]==a)
a++;
else return a;
}
return a++;
}
}
return 1;
}
}
牛逼的做法:
把正数都放到一个集合里遍历
1.不确定符合要求的正数有多少个,因此用list来记录符合要求的正数
2.因为取得list中数字的时候 不能取到它的索引,建一个辅助数组来标记。 注意辅助数组的大小是list大小+2 比较的时候从索引1开始避开0,最后一个索引来处理1-n都在list中的情况,那么最后一个就是要取的值
用数值list的大小进行比较。若数值大于list的大小,那么这个值一定不符合要求 不作处理数组默认为false,如果缺失的值在小于list大小的数值范围内那么以它为索引的辅助数组值没有被处理过时默认的false 从索引值为1开始遍历一遍辅助数组第一个false是所求值
public class Solution {
public int firstMissingPositive(int[] nums) {
List<Integer> list=new ArrayList();
for(int k:nums){
if(k>0){
list.add(k);
}
}
// int missing=list.size()+1;
boolean[] tag=new boolean[list.size()+2];
for(int k:list){
if(k<=list.size()){
tag[k]=true;
}
}
for(int i=1;i<tag.length;i++){
if(!tag[i]){
return i;
}
}
return 0;
}
}