41. First Missing Positive

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.

这个题是找到第一个缺失的正数,即找到1-n中缺失的正数,如果没有缺失则应该返回n+1

窃以为这个题的关键在于搞清楚当给定包含n个数的数组时,最小缺失的数必然在1-(n+1)

间产生,因为这个范围内的数才是潜在的最小缺失的正数。

结题思路参考http://www.cnblogs.com/AnnieKim/archive/2013/04/21/3034631.html

参考代码如下

class Solution {
public:
    int firstMissingPositive(int A[], int n) {
        int i = 0;
        while (i < n)
        {
            if (A[i] != (i+1) && A[i] >= 1 && A[i] <= n && A[A[i]-1] != A[i])
                swap(A[i], A[A[i]-1]);
            else
                i++;
        }
        for (i = 0; i < n; ++i)
            if (A[i] != (i+1))
                return i+1;
        return n+1;
    }
};

我的代码如下:

public class Solution {
    public int firstMissingPositive(int[] nums) {
         
         if(nums==null||nums.length==0)
             return 1;
         for(int i = 0;i < nums.length; i++)
             if(nums[i]!=(i+1)&&nums[i]>=1&&nums[i]<=nums.length&&nums[nums[i]-1]!=nums[i]){
                 int temp = nums[i];
                 nums[i] = nums[temp-1];
                 nums[temp-1] = temp;
                 i--;
             }
         for(int i = 0;i < nums.length; i++)
             if(nums[i]!=(i+1))
                 return i+1;
         return (nums.length+1);
    }
}

主要在于交换部分需要注意不要用nums[nums[i]-1]因为nums[i]的值会改变,而temp的值是不变的,所以用temp来替换nums[i],

原文地址:https://www.cnblogs.com/lxk2010012997/p/6411457.html