这道题一开始把题意理解偏了,我以为是找出串中第一个缺失的正数,比如5,6,8返回7,但是题意是从1开始5,6,8应该返回1。这样就容易了很多。只要把位置和数字对应上即可,如果数字小于等于0直接无视,如果大于数组长度也无视,因为如果有数字大于数组长度,则从1~数组长度必有一个数字缺失。遇到数字i就把他交换到A[i-1]的位置上去,调整后如果出现A[i]!=i+1则返回i+1;注意的是交换后需要i--重新访问一下这个位置。
public int firstMissingPositive(int[] A) {
if(A.length==0) return 1;
if(A.length==1){
if(A[0]==1)return 2;
else return 1;
}
int tmp;
for(int i=0;i<A.length;i++){
if(A[i]!=i+1&&A[i]>0&&A[i]<A.length&&A[A[i]-1]!=A[i]){
tmp=A[A[i]-1];
A[A[i]-1]=A[i];
A[i]=tmp;
i--;
}
}
for(int i=0;i<A.length;i++){
if(A[i]!=i+1) return i+1;
}
return A.length+1;
}
Update 2015/08/22: 上面的可以更加简洁
public class Solution {
/**
* @param A: an array of integers
* @return: an integer
*/
public int firstMissingPositive(int[] A) {
// write your code here
int tmp;
for(int i=0;i<A.length;i++){
if(A[i]!=i+1 && A[i]>0 && A[i]<A.length && A[A[i]-1]!=A[i]){
tmp=A[A[i]-1];
A[A[i]-1]=A[i];
A[i]=tmp;
i--;
}
}
for(int i=0;i<A.length;i++){
if(A[i]!=i+1) return i+1;
}
return A.length+1;
}
}