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;
    }
};

 

运行结果

 

相关文章
|
12月前
|
边缘计算 运维 监控
|
监控 jenkins 测试技术
理解并实现持续集成(CI)与持续部署(CD):加速软件开发的关键步骤
【5月更文挑战第27天】本文介绍了CI/CD在加速软件开发中的关键作用。CI(持续集成)通过频繁集成代码并自动构建测试,减少错误,提高开发速度和代码质量。实现CI需要版本控制系统(如Git)、自动化构建工具(如Jenkins)和测试框架。CD(持续部署)则进一步自动将通过测试的代码部署到生产环境,提供快速反馈,降低风险。实现CD需配置管理工具(如Ansible)、容器技术(如Docker)和云基础设施。CI与CD结合,形成高效开发流程,最佳实践包括保持主干干净、自动化所有流程、持续监控、快速回滚和持续学习。
|
小程序 JavaScript Java
鲜花销售|鲜花销售小程序|基于微信小程序的鲜花销售系统设计与实现(源码+数据库+文档)
鲜花销售|鲜花销售小程序|基于微信小程序的鲜花销售系统设计与实现(源码+数据库+文档)
351 0
|
机器学习/深度学习 人工智能 安全
【专栏】云计算平台的比较与选择:AWS、Azure 和 Google Cloud
【4月更文挑战第28天】本文对比了AWS、Azure和Google Cloud三大云计算平台,强调了解它们的差异对于企业选择合适云服务的重要性。AWS以其丰富功能和广泛覆盖领先,Azure与微软生态紧密集成,适合已使用微软技术的企业,而Google Cloud在大数据和AI领域有优势。选择时应考虑服务功能、成本、扩展性、技术支持、安全合规及行业生态。最终决策应基于全面评估以确保为企业提供高效、可靠的云服务。
1312 0
|
机器学习/深度学习 网络架构 开发者
YOLOv5改进 | 注意力篇 | DiverseBranchBlock(DBB)多元分支模块(有效涨点)
YOLOv5改进 | 注意力篇 | DiverseBranchBlock(DBB)多元分支模块(有效涨点)
400 0
|
测试技术
软件测试的艺术:从新手到专家的蜕变之旅
在数字时代的浪潮中,软件测试不仅是质量的守护者,更是创新与完善的桥梁。本文将引导你穿梭于软件测试的迷宫,探索从基础理论到高级实践的奥秘,揭示如何通过持续学习、实践反思和技能提升,实现从测试新手到行业专家的华丽转变。让我们一起走进软件测试的世界,解锁那些让测试艺术绽放光彩的秘密。
|
负载均衡 Java 开发者
微服务组件 Open Feign 远程调用
OpenFeign是一个声明式的Web服务客户端,它是Spring Cloud生态系统中的一个组件,用于简化和优化微服务之间的远程调用。通过使用注解和接口定义的方式,开发者可以轻松地实现对其他微服务的访问。 使用OpenFeign,您只需定义一个接口,并通过注解来配置该接口对应的远程服务的URL、请求方法、请求参数等信息,OpenFeign将自动生成可用于调用远程服务的实现。这样,您就可以像调用本地方法一样调用远程服务,而无需编写繁琐的HTTP请求和解析代码。
414 0
|
存储 弹性计算 数据可视化
ECS:实例概述
ECS实例是云上的虚拟计算服务器,包含vCPU、内存、操作系统、网络、磁盘等基础组件
127 0
|
XML IDE 编译器
第一个excel VBA demo —— 添加信号并生成一段Verilog代码
第一个excel VBA demo —— 添加信号并生成一段Verilog代码
291 0
第一个excel VBA demo —— 添加信号并生成一段Verilog代码
uniapp实现横向滚动样式条
本文讲解,uniapp如何实现横向滚动样式条
1413 0
uniapp实现横向滚动样式条