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