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];
    }
}
}

运行结果:

猜你喜欢

转载自blog.csdn.net/FaustoPatton/article/details/88366745