leetcode41.缺失的第一个正数

1.使用map

记录大于1的数字的出现情况

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int len=nums.size();
        map<int,int> m;
        for(int i=0;i<len;i++)
          if(nums[i]>0)
            m[nums[i]]++;
        auto iter=m.begin();
        int val=0;
        while(iter!=m.end())
        {
            if(iter->first>1&&iter==m.begin())//第一个元素大于1(包括只有一个元素且大于1的情况)
              return 1;
            val=iter->first;
            iter++;
            if(iter!=m.begin()&&iter->first>val+1)//说明相邻元素差值大于1
              return val+1;
        }
        return val+1;//这种情况下val保存了最后一个元素的值
    }
};

空间复杂度O(n),不符合题意

2.另一种解法

遍历数组,将元素值大于1,且小于数组长度的值放在对应位置,然后遍历数组,查看下标和元素的值是否一样,否则,下标就是缺失的值;若遍历完,则缺失的是数组长度+1

代码如下:

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int len=nums.size();
        for(int i=0;i<len;i++)
        {
           while(nums[i]>0&&nums[i]<=len&&nums[i]!=nums[nums[i]-1])//直到nums[i]放的是正确的值,或越界
             swap(nums[i],nums[nums[i]-1]);
        }
        
        int i=0;
        while(i<len)
        {
            if(nums[i]!=i+1)
              return i+1;
            i++;
        }
        
        return len+1;

    }
};

猜你喜欢

转载自blog.csdn.net/qq_38196982/article/details/106979254