题目链接: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.

这道题的要求是找到数组A(未排序)中第一个缺少的正整数。要求O(n)时间复杂度。

这道题的直接思路就是先排序,然后遍历一遍就能找到第一个缺少的正整数了。不过这样的话,时间复杂度是O(nlogn)。

题目要求O(n)时间复杂度,那么还能不能更快些呢?可以考虑从排序上动手脚。类似于计数排序的思路,申请个同样大小的空数组B,然后给定数组A,把A中出现的数字放到B中对应于B下标的位置(如果该数字大小超过B的范围,则不处理),例如把5放到B[4]里等等。最后,再遍历B数组,就能找到第一个缺少的正整数了。

由于上面申请的B数组和A一样大,那么可不可以直接用A来代替B呢?当然可以,就是在遍历A的时候,如果数字和位置不对应,就交换到对应位置即可。

时间复杂度:O(n)

空间复杂度:O(1)

 1 class Solution
 2 {
 3 public:
 4     int firstMissingPositive(int A[], int n)
 5     {
 6         for(int i = 0; i < n; ++ i)
 7             while(A[i] > 0 && A[i] <= n && A[A[i] - 1] != A[i])
 8                 swap(A[i], A[A[i] - 1]);
 9         
10         for(int i = 0; i < n; ++ i)
11             if(A[i] != i + 1)
12                 return i + 1;
13         
14         return n + 1;
15     }
16 };