LeetCode First Missing Positive

来源:互联网 发布:西南交通大学网络缴费 编辑:程序博客网 时间:2024/06/09 13:45

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.

思路一:首先将符合条件的正数和其他数分开,然后在正数中进行判断。假设符合条件的数的个数为N,假设nums[i]为temp,将nums[temp]的值设为对应的负数,说明temp这个数存在,最后再进行遍历判断丢失了那个正数。

代码如下:

class Solution {public:    void swap(vector<int>& nums,int i,int j)    {        if(i!=j)        {            nums[i] ^= nums[j];            nums[j] ^= nums[i];            nums[i] ^= nums[j];        }    }        int partition(vector<int>& nums)    {        int i,q=-1;        i=0;        for(i=0;i<nums.size();i++)        {            if(nums[i]>0)            {                    q++;                swap(nums,q,i);            }        }        return q;    }        int firstMissingPositive(vector<int>& nums) {        if(nums.empty())            return 1;        int k = partition(nums)+1;        for(int i=0;i<k;i++)        {            int temp = abs(nums[i]);            if(temp<=k)                nums[temp-1] = nums[temp-1]>0?-nums[temp-1]:nums[temp-1];        }        for(int i=0;i<k;i++)        {            if(nums[i] > 0)                return i+1;        }        return k+1;    }};


思路二:将数值放到其对的下标处,然后判断哪个下标的对应的数值不是下标值加1,那么该下标值加1就是所求答案

代码如下:

class Solution {public:    void swap(vector<int>& nums,int i,int j)    {        if(i!=j)        {            nums[i] ^= nums[j];            nums[j] ^= nums[i];            nums[i] ^= nums[j];        }    }        int firstMissingPositive(vector<int>& nums) {        for(int i=0;i<nums.size();i++)        {            if(nums[i] == i+1) continue;                        int x = nums[i];            while(x >= 1 && x <= nums.size() && nums[x-1] != x)            {                swap(nums,i,x-1);                x=nums[i];            }        }                for(int i=0;i<nums.size();i++)        {            if(nums[i] != i+1)                return i+1;        }        return nums.size()+1;    }};

效率依然不理想 - - 



0 0