美文网首页
缺失的第一个正数

缺失的第一个正数

作者: 王王王王王景 | 来源:发表于2019-07-20 20:55 被阅读0次

    给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

    示例 1:

    输入: [1,2,0]
    输出: 3
    

    示例 2:

    输入: [3,4,-1,1]
    输出: 2
    

    示例 3:

    输入: [7,8,9,11,12]
    输出: 1
    

    说明:

    你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。

    
    /*
    思路:
    (1) 如果想要找到缺失的最小正数,那么正常情况nums.size = n, 我们需要关心的数据是[1, 2, ,3, ... , n];
    (2) 小于等于0的数字我们不需要关心,大于n的数字我们也不需要管(因为正常情况以1递增该数组是不可能超过n的)
    (3) 所以我们关心的数据都是1 <= x <= n的;所有的数据必须以1来递增,否则就会存在缺失;
    (4) 我们可以将数组的下标当作hash map的key值,将所有为x的有效数字放入下标为x-1的数组中,无效数字我们暂时不关心,
    可以利用一次遍历完成此操作;
    (5) 接着我们再利用一次遍历去找到第一个无法对应下标的数字,证明该下标存放是无效数字,因此在该位置上存在缺失,为修小缺失数;
    */
    
    class Solution {
    public:
        void swap(int &x, int &y) {
            int temp = y;
            y = x;
            x = temp;
        }
        int firstMissingPositive(vector<int>& nums) {
            for(int i = 0; i < nums.size();) {
                if(nums[i] <= 0 || nums[i] == (i + 1)) {
                    ++i;
                    continue;
                }
                if(nums[i] >= 1 && nums[i] <= nums.size()) {
                    if(nums[i] != nums[nums[i] - 1])
                        swap(nums[i], nums[nums[i] - 1]);
                    else ++i; // [1,1]
                } else ++i;
            }
            
            int cur = 1;
            for(int i = 0; i < nums.size(); ++i) {
                if(nums[i] != i + 1) return cur;
                else ++cur;
            }
            return cur; // [1]
        } 
    };
    
    

    相关文章

      网友评论

          本文标题:缺失的第一个正数

          本文链接:https://www.haomeiwen.com/subject/rcxplctx.html