41. First Missing Positive

    /*
     * 41. First Missing Positive 
     * 2016-5-4 by Mingyang
     * 这道题目要求线性时间和constant空间,本来我想多用一个数组,把对应的数字直接填满另外的数组
     * ,但是如果只能有一个array的话,就是另外一个情况呢
     * 需要考虑那个地方是否有值了 A[0]=1,A[1]=2,A[2]=3...如果抽到了3,就把A2换成3
     * ,不过一定要i--,因为只有减了以后再判断是不是漏掉一个什么的
     * 首先是我自己的代码,写的确实比较丑,因为自己是A[0]=0,A[1]=1的思路,殊不知稍稍变通一下就可以世界变的更加美好
     */
    public int firstMissingPositive1(int[] nums) {
        int len=nums.length;
        if(nums==null||len==0)
          return 1;
       if(len==1)
         return nums[0]==1?2:1;
        for(int i=0;i<len;i++){
            if(nums[i]<0||nums[i]>len-1||nums[i]==nums[nums[i]])
              continue;
            else{
             swap2(nums,i,nums[i]);
             i--;
            }
        }
        for(int i=0;i<len;i++){
            if(nums[i]!=i&&i!=0){
                return i;
            }
        }
        if(nums[0]!=0&&nums[0]==nums[len-1]+1){
           return nums[0]+1; 
        }
        return len;
    }
    public void swap2(int[] array, int j,int k){
        int temp=array[j];
        array[j]=array[k];
        array[k]=temp;
    }
    //稍稍错位一下能让代码更加简单
    public int firstMissingPositive(int[] A) {
        if (A == null || A.length == 0)
            return 1;
        for (int i = 0; i < A.length; i++) {
            if (A[i] <= A.length && A[i] > 0 && A[A[i] - 1] != A[i]) {
                int temp = A[A[i] - 1];
                A[A[i] - 1] = A[i];
                A[i] = temp;
                i--;
            }
        }
        for (int i = 0; i < A.length; i++) {
            if (A[i] != i + 1)
                return i + 1;
        }
        return A.length + 1;
    }
原文地址:https://www.cnblogs.com/zmyvszk/p/5460752.html