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. 第1个元素是3,必须把它放到第3个位置上,因为-1是负数,直接交换,现在数组变为[-1, 4, 3, 1]。
  2. 第2个元素是4,必须把它放到第4个位置上,因为1是正数,交换后数组变为[-1, 1, 3, 4],因为第2个位置上的值变为1,需要继续处理。
  3. 第2个元素是1,必须把它放到第1个位置上,因为-1是负数,直接交换,现在数组变为[1, -1, 3, 4]。
  4. 第3个元素现在是3,不用处理,继续。
  5. 第4个元素现在是4,不用处理,继续。
  6. 现在遍历数组,发现第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 };

 

posted @ 2013-11-06 10:08  移山测试工作室黑灯老师  阅读(413)  评论(0编辑  收藏  举报
count website visits
Buy Computers