Leetcode第41题: First Missing Positive(java实现)
题目描述:
题目解答:
这道题目本人没有做出来,下面介绍的是他人的一组方法,觉得很有效。主要包括一下三步:
第一步:将数组中大于0值和小于等于0的值进行分区,数组中前面的部分存储大于0的数值,如下:
原数组是[-1,1,2,4,5,-5,6,-6],第一步后变成:[1, 2, 4, 5, 6, -5, -1, -6]
第二步:将所有数值中满足正确顺序的数字去负数,则得到A中第一个正数的数字则为错误的数字
经过第二步就成为了:[-1, -2, 4, -5, -6, -5, -1, -6]
第三步就很明确了:就是找到A中第一个大于0的数值,该数值所在的index+1则为那个最小的missing值。
下面是代码:
class Solution {
public int firstMissingPositive(int[] A) {
int n=A.length;
if(n==0)
return 1;
//第一步
int k=partition(A)+1;
int temp=0;
int first_missing_Index=k;
//第二步
for(int i=0;i<k;i++){
temp=Math.abs(A[i]);
if(temp<=k)
A[temp-1]=(A[temp-1]<0)?A[temp-1]:-A[temp-1];
}
//第三步
for(int i=0;i<k;i++){
if(A[i]>0){
first_missing_Index=i;
break;
}
}
return first_missing_Index+1;
}
public int partition(int[] A){
int n=A.length;
int q=-1;
for(int i=0;i<n;i++){
if(A[i]>0){
q++;
swap(A,q,i);
}
}
return q;
}
public void swap(int[] A, int i, int j){
if(i!=j){
A[i]^=A[j];
A[j]^=A[i];
A[i]^=A[j];
}
}
}