41. First Missing Positive
Given an unsorted integer array, find the first missing positiveinteger.
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.
题目要求寻找第一个丢失的正数。
看题没思路-----苦思未果看题解去
然后我就说说我看的这两种解:
第一种比较正规:
大题思路就是首先将正和负的分成两份---直接过滤可以:
If(nums[i]>0)nums[n++]=nums[i];
然后就是对前n个数遍历一边并对在[1,n]之间的数tmp=nums[i]对应的下标 nums[tmp-1] 的数变成负数。
最后在遍历一遍查看那个(i<n)第一个非负数即时结果。
代码
public class Solution{
public int firstMissingPositive(int[] nums){
int n=0;
for(int i=0;i<nums.length;i++)
if(nums[n]>0) nums[n++]=nums[i];
int res=n,tmp;
for(int i=0;i<n;i++){
tmp=Math.abs(nums[i]);
if(tmp<=n) nums[tmp]=-Math.abs(nums[tmp]);
}
for(int i=0;i<n;i++){
if(nums[i]>0) {res=i+1;break;}
}
return res;
}
}
第二种有点脑筋急转弯的感觉
遍历一遍所有的数tmp=nums[i],当tmp>0时 将交换下标为tmp-1和i 的数即swap(nums,tmp,i);
最后遍历一遍所有数查到nums[i]!=i+1的即为结果.
代码:
public class Solution {
public int firstMissingPositive(int[] nums) {
for(int i=0;i<nums.length;++i)
// if(nums[i]>0&&nums[i]<=nums.length)--->this will be wrong when the nums[i] is big
// for example {3,4,-1,1}
while(nums[i]>0&&nums[i]<=nums.length&&nums[nums[i]-1]!=nums[i])
swap(nums,i,nums[i]-1);
for(int i=0;i<nums.length;++i)
if(nums[i]!=i+1)
return i+1;
return nums.length+1;
}
public void swap(int[] nums,int i,int j){
int tmp=nums[i];
nums[i]=nums[j];nums[j]=tmp;
}
}