LeetCode 41. 缺失的第一个正数

Posted Blocking The Sky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 41. 缺失的第一个正数相关的知识,希望对你有一定的参考价值。

题目描述

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

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例 1:

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

示例 2:

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

解题思路

思路1:原地置换

首先通过数学分析明确,缺失的正数和数组长度n的关系
两种可能:

1、缺失的正数落 在[1,n]中间,意味着,数组中必然有不在[1,n]的数字或在[1,n]范围内的重复数字。

2、缺失的正数大小超出了n,说明数组必然包括[1,n]区间的所有数字,无其他数字。
基于以上逻辑分析,可以原地修改数组,将原本数组中不在[1,n]的数字修改为n+2,以排除负数和0的影响。

代码

思路1:

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n = nums.size();
        //将不在[1,n]的数字替换为n+2;
        for (int i = 0;i<n;++i){
            if (nums[i] > 0&&nums[i]<=nums.size())
                continue;
            nums[i] = n+2;
        }
        for (int i = 0;i<n;++i)
        {
        //遍历当前数组,如果当前值的绝对值处于[1,n]中且nums[当前值的绝对值] > 0,说明之前没有遇到这个正数,将其置为负数,标识这个正数没有缺失    
            if (abs(nums[i]) > 0&&abs(nums[i])<=nums.size() && nums[abs(nums[i])-1] > 0){
                    nums[abs(nums[i])-1] = -nums[abs(nums[i])-1];
            }
        }
        //经过遍历,所有[1,n]的正数对应的数组位置的值都为负数
        for (int i = 0;i<n;i++)
        {
            //遍历数组,如果发现有位置大于0,说明数组之前没有这个值,输出该值
            if (nums[i] > 0)
                return i+1;
        }
        //如果数组都为负数,那缺失的值为数组长度+1
        return n+1;

    }
};

以上是关于LeetCode 41. 缺失的第一个正数的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 41. 缺失的第一个正数 | Python

[leetcode] 41. 缺失的第一个正数

leetcode 41 缺失的第一个正数

leetcode——41. 缺失的第一个正数

LeetCode 41. 缺失的第一个正数

Leetcode-41. 缺失的第一个正数