LeetCode-41 缺失的第一个正整数

简介: LeetCode-41 缺失的第一个正整数

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/first-missing-positive

题目描述

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

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

 

示例 1:

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

输出:3

示例 2:

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

输出:2

示例 3:

输入:nums = [7,8,9,11,12]

输出:1

 

提示:

1 <= nums.length <= 5 * 105

-231 <= nums[i] <= 231 - 1

 

解题思路

理论上并不存在时间复杂度为O(n) 空间复杂度为 O(1)的算法来做这道题,所以需要借助题目提供的nums来解,nums的范围为n,那么可以利用nums来判断1-n中是否有数字出现,如果没有,那么最小正整数为n+1,否则就是第一个缺失的数字。

一个思路是利用负号来记录1-n中数字是否出现过,先将所有负数变成n+1,然后遍历,如果数字x出现就将数字x对应的下标x-1的值设置为负数,等结束后第一个正数的下标加一就是缺失的数字。

另一个思路是重置归位,将1-n中的数字重置到nums对应的位置上并且继续重置被交换的数,那么第一个错位的数字就是缺失的数字。注意由于nums中数字可能相同,所以交换的双方相等就可以结束交换继续遍历。

代码展示

负号做标记

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n = nums.size();
        for(int i = 0; i < n; i++)
        {
            if(nums[i] <= 0)
                nums[i] = n + 1;
        }
        for(int i = 0; i < n; i++)
        {
            if(abs(nums[i]) < n + 1)
                nums[abs(nums[i]) - 1] = nums[abs(nums[i]) - 1] < 0 ? nums[abs(nums[i]) - 1] : -1 * nums[abs(nums[i]) - 1];
        }
        for(int i = 0; i < n; i++)
            if(nums[i] > 0)
                return i + 1;
        return n + 1;
    }
};

置换

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

 

运行结果

 

相关文章
|
1月前
|
人工智能 弹性计算 数据可视化
阿里云一键部署OpenClaw保姆级攻略,直接抄作业!
阿里云推出OpenClaw一键部署方案,零代码快速拥有AI数字员工:自动处理邮件、管理日程、辅助编程。本文提供保姆级教程,涵盖轻量服务器部署、百炼API配置、避坑指南与钉钉/飞书接入、ClawHub插件扩展等进阶玩法,开箱即用!
513 15
|
2月前
|
SQL 存储 机器学习/深度学习
智能问数技术路线对比
本文横向对比2026年主流智能问数技术路线:字节(宽表+NL2SQL)、帆软(ChatBI升级)、京东(预制指标)、Palantir/UINO(本体+智能体)。分析各路线在准确率、泛化性、人力投入、实时性等维度的优劣,助力企业基于业务场景精准选型。(239字)
|
7月前
|
存储 安全 API
73_安全配置:LLM开发环境的全面防护指南
在2025年的AI开发环境中,大型语言模型(LLM)已成为核心技术,但伴随其广泛应用的是日益严峻的安全挑战。据统计,2025年第一季度发生的AI安全事件中,LLM环境配置不当导致的漏洞占比高达43%,造成的损失超过2.1亿美元。本文将深入探讨LLM开发环境的安全配置最佳实践,帮助开发者构建一个安全、可靠的开发环境。
812 0
|
Go
Golang注释与godoc详解
这篇文章详细介绍了Go语言中注释的格式、位置以及如何使用godoc工具生成和查看项目代码的注释文档。
547 4
Golang注释与godoc详解
|
安全 NoSQL Shell
pocsuite3 工具使用
pocsuite3 工具使用
550 4
|
边缘计算 运维 监控
|
Ubuntu Linux Shell
内网穿透实战应用-——【如何在树莓派上安装cpolar内网穿透】
内网穿透实战应用-——【如何在树莓派上安装cpolar内网穿透】
344 1
内网穿透实战应用-——【如何在树莓派上安装cpolar内网穿透】
|
Ubuntu Linux
在Linux中,在不同的Linux发行版中(如RPM-based和DEB-based)如何安装、升级、删除软件包?
在Linux中,在不同的Linux发行版中(如RPM-based和DEB-based)如何安装、升级、删除软件包?
|
监控 jenkins 测试技术
理解并实现持续集成(CI)与持续部署(CD):加速软件开发的关键步骤
【5月更文挑战第27天】本文介绍了CI/CD在加速软件开发中的关键作用。CI(持续集成)通过频繁集成代码并自动构建测试,减少错误,提高开发速度和代码质量。实现CI需要版本控制系统(如Git)、自动化构建工具(如Jenkins)和测试框架。CD(持续部署)则进一步自动将通过测试的代码部署到生产环境,提供快速反馈,降低风险。实现CD需配置管理工具(如Ansible)、容器技术(如Docker)和云基础设施。CI与CD结合,形成高效开发流程,最佳实践包括保持主干干净、自动化所有流程、持续监控、快速回滚和持续学习。
|
数据可视化 JavaScript 定位技术
线性回归和时间序列分析北京房价影响因素可视化案例(上)
线性回归和时间序列分析北京房价影响因素可视化案例

热门文章

最新文章