41. 缺失的第一个正数

题目描述

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-n之间的数,其他的数没有保存的价值,也无法保存(这个原地数组下标为0-n-1,只能保存1-n之间的数))。

代码实现

class Solution {
public:
    int firstMissingPositive(vector<int>& nums)
    {
        int n = nums.size();
        if(n == 0)
            return 1;  
        int i = 0;
        while(i < n)//循环目的:把数组元素中范围在1-n之间的整数放在正确的位置上
        {
            if(nums[i] <= 0)
                i++;
            else
            {   //如果是正数,并且还没有没有放在正确的位置上
                if(nums[i]<=n && nums[i]!=i+1 && nums[nums[i]-1]!=nums[i])
                {
                    swap(nums[i], nums[nums[i]-1]);//有可能把当前位置后边需要判断的数交换到这里,所以
                }                        //i不能递增
                else
                    i++;                
            }
        } 
        for(int i = 0; i < n; i++)
        {
            if(nums[i] != i+1)
            {
                return i+1;
            }
        }
        return n+1;
    }
};

posted on 2021-04-04 22:20  朴素贝叶斯  阅读(25)  评论(0编辑  收藏  举报

导航