找到第一个丢失的正数

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.

此题关键在于理解first missing positive intege。

题意为:一共n个数,有正数有负数,还有0.找到一个最小的正数不在这个集合中

可以分析得到,整个最小的正数,最小是1,最大是 n + 1.

解法1:

用hash保存一下每个元素,然后从1开始查,check是否在hash里面,不在输出即可。

简单明了,但是如果空间复杂度有限制?即 不用hash怎么办?

解法2:

用数组本身作为hash表进行查找,代码如下:

   int firstMissingPositive(int A[], int n) {
        int i;
        for (i = 0; i < n; ) {
            if (A[i] == i + 1) {
                ++i;
            }
            else if ((A[i] < i + 1) || (A[i] - 1 >= n) || (A[A[i] - 1] == A[i])) {
                A[i] = A[--n];
            }
            else {
               int  t = A[i];
                A[i] = A[t - 1];
                A[t - 1] = t;
             }
        }
        return n + 1;
    }

 思路超级赞!

posted @ 2012-12-30 11:40  David Luo  阅读(151)  评论(0编辑  收藏  举报