leetcode: First Missing Positive
http://oj.leetcode.com/problems/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放在第1个,2放在第2个,最后扫描数组,如果第n个位置上的值不是n,那么n就是我们要找的数了。以例子中的[3, 4, -1, 1]举例:
- 第1个元素是3,必须把它放到第3个位置上,因为-1是负数,直接交换,现在数组变为[-1, 4, 3, 1]。
- 第2个元素是4,必须把它放到第4个位置上,因为1是正数,交换后数组变为[-1, 1, 3, 4],因为第2个位置上的值变为1,需要继续处理。
- 第2个元素是1,必须把它放到第1个位置上,因为-1是负数,直接交换,现在数组变为[1, -1, 3, 4]。
- 第3个元素现在是3,不用处理,继续。
- 第4个元素现在是4,不用处理,继续。
- 现在遍历数组,发现第2个位置上的值不是2,那么2就是我们要找的数。
1 class Solution { 2 public: 3 int firstMissingPositive(int A[], int n) { 4 if (0 == n) { 5 return 1; 6 } 7 8 for (int i = 0; i < n; ++i) { 9 if ((i + 1) == A[i]) { 10 continue; 11 } 12 else if (A[i] > 0) { 13 int number = A[i]; 14 15 while ((number <= n) && A[number - 1] != number) { 16 int tmp = A[number - 1]; 17 18 A[number - 1] = number; 19 20 if (tmp <= 0) { 21 break; 22 } 23 else { 24 number = tmp; 25 } 26 } 27 } 28 } 29 30 for (int i = 0; i < n; ++i) { 31 if (A[i] != (i + 1)) { 32 return i + 1; 33 } 34 } 35 36 return n + 1; 37 } 38 };