Problem:
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.
拿到这道题自己也是没有思路,看了讨论区的回答才恍然大悟。首先明确First Missing Positive的含义,是指从1开始的第一个没有出现的正整数。既然是按序出现的正整数,就可以用数组的索引做文章。把每个正整数放到相同索引的位置。然后找到第一个索引与元素不匹配的数即为所求。此外,还要注意两点:
1. 如果A[i]与A[A[i]-1]相同,不需要交换;
2. 把A[i]与A[A[i]-1]交换后,A[i]可能和索引仍然不匹配,需要继续交换直到A[i]=i+1,或者超出[1,A.length]的范围。
Solution:
public class Solution {
public int firstMissingPositive(int[] A) {
if(A==null||A.length==0)
return 1;
for(int i=0;i<A.length;i++)
while(A[i]!=i+1&&A[i]>0&&A[i]<=A.length&&A[i]!=A[A[i]-1])
{
int tmp = A[i];
A[i] = A[tmp-1];
A[tmp-1] = tmp;
}
int i = 0;
for(;i<A.length;i++)
if(A[i]!=i+1)
break;
return i+1;
}
}
public int firstMissingPositive(int[] A) {
if(A==null||A.length==0)
return 1;
for(int i=0;i<A.length;i++)
while(A[i]!=i+1&&A[i]>0&&A[i]<=A.length&&A[i]!=A[A[i]-1])
{
int tmp = A[i];
A[i] = A[tmp-1];
A[tmp-1] = tmp;
}
int i = 0;
for(;i<A.length;i++)
if(A[i]!=i+1)
break;
return i+1;
}
}

被折叠的 条评论
为什么被折叠?



