首页 > 代码库 > 【LeetCode】First Missing Positive (2 solutions)

【LeetCode】First Missing Positive (2 solutions)

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.

 

解法一:O(nlogn) time and O(1) space

无脑解法-->先排序O(nlogn)

思想如下:

1、略去非正的前缀数。

2、记下一个待匹配的正整数为tag。

考虑重复,如果A[i]等于tag,则tag++

如果A[i]大于tag,则返回tag

A[i]不可能小于tag,由排序可以保证。

class Solution {public:    int firstMissingPositive(int A[], int n) {        if(n == 0)            return 1;        sort(A,A+n);        int i = 0;        while(i < n && A[i] <= 0)            i ++;        if(i == n)            return 1;        int tag = 1;        for(; i < n; i ++)        {            if(A[i] > tag)            //miss the tag                return tag;            else if(A[i] == tag)            //next positive                tag ++;            else                ;        }        //i==n, miss the tag        return tag;    }};

 

解法二:O(n) time and O(n) space

稍作思考就可以知道,n容量的数组,最多覆盖的正整数为连续的1~n

也就是说,丢失的正整数要么出现在1~n中,要么就是n+1

因此可以构造大小为n的数组tag,tag[i]记录i+1这个数字是否出现在A中。

如果tag全true则返回n+1,否则返回第一个tag为负的下标+1

class Solution {public:    int firstMissingPositive(int A[], int n) {        if(n == 0)            return 1;        //tag[i] means whether i+1 exists in A        //at most 1~n, then return n+1        vector<bool> tag(n, false);        for(int i = 0; i < n; i ++)        {            if(A[i] > 0 && A[i] <= n)                tag[A[i]-1] = true;        }        for(int i = 0; i < n; i ++)        {            if(tag[i] == false)                return i+1;        }        return n+1;    }};

【LeetCode】First Missing Positive (2 solutions)