每日一题——缺失的第一个正整数
缺失的第一个正整数
- 题目描述
- 进阶:
- 数据范围:
- 示例
- 示例 1
- 示例 2
- 示例 3
- 题解
- 思路
- 代码实现
- 代码解释
- 复杂度分析
- 总结
题目描述
给定一个无重复元素的整数数组 nums,请你找出其中没有出现的最小的正整数。
进阶:
- 时间复杂度:
O(n) - 空间复杂度:
O(1)
数据范围:
- 数组元素
nums[i]的值在 − 2 31 ≤ n u m s [ i ] ≤ 2 31 − 1 -2^{31} \leq nums[i] \leq 2^{31} - 1 −231≤nums[i]≤231−1 之间。 - 数组长度
len(nums)满足 0 ≤ l e n ( n u m s ) ≤ 5 × 1 0 5 0 \leq len(nums) \leq 5 \times 10^5 0≤len(nums)≤5×105。
示例
示例 1
输入:
[1, 0, 2]
输出:
3
示例 2
输入:
[-2, 3, 4, 1, 5]
输出:
2
示例 3
输入:
[4, 5, 6, 8, 9]
输出:
1
题解
本题的关键点是寻找数组中最小的缺失正整数。由于数组中没有重复的元素,我们可以利用数组下标和数值之间的关系来进行处理。具体步骤如下:
思路
-
无效值处理:
- 数组中值小于等于0或大于数组长度的数值不可能是我们要找的最小正整数,可以将它们替换为一个不会影响结果的数字(例如
numsSize + 1)。
- 数组中值小于等于0或大于数组长度的数值不可能是我们要找的最小正整数,可以将它们替换为一个不会影响结果的数字(例如
-
就地交换:
- 数组中的每个数字应该位于它应处的位置。例如,数字
1应该位于索引0,数字2应该位于索引1,以此类推。 - 我们通过交换将数字放到正确的位置上。
- 数组中的每个数字应该位于它应处的位置。例如,数字
-
查找缺失的最小正整数:
- 遍历数组,找到第一个没有正确放置的数字,返回它的索引对应的正整数。
- 如果所有的数字都正确放置了,说明数组中包含了所有从
1到numsSize的正整数,那么最小缺失正整数为numsSize + 1。
代码实现
#include <stdio.h>
#include <stdlib.h>/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** @param nums int整型一维数组 * @param numsLen int nums数组长度* @return int整型*/
int minNumberDisappeared(int* nums, int numsLen) {// 1. 将所有不合法的数值替换为 numsLen + 1for (int i = 0; i < numsLen; i++) {if (nums[i] <= 0 || nums[i] > numsLen) {nums[i] = numsLen + 1;}}// 2. 将每个数值放到它应该在的位置上for (int i = 0; i < numsLen; i++) {int num = abs(nums[i]); // 获取当前值的绝对值if (num <= numsLen && nums[num - 1] > 0) {nums[num - 1] = -nums[num - 1]; // 标记 num 已经出现}}// 3. 查找第一个没有标记的正整数for (int i = 0; i < numsLen; i++) {if (nums[i] > 0) {return i + 1; // 返回缺失的第一个正整数}}// 4. 如果没有缺失,返回 numsSize + 1return numsLen + 1;
}
代码解释
-
无效值处理:
if (nums[i] <= 0 || nums[i] > numsLen) {nums[i] = numsLen + 1; }- 将数组中所有小于等于0或大于
numsLen的数值替换为numsLen + 1,因为这些数值不可能是我们要找的最小正整数。
- 将数组中所有小于等于0或大于
-
就地交换:
int num = abs(nums[i]); if (num <= numsLen && nums[num - 1] > 0) {nums[num - 1] = -nums[num - 1]; // 标记为已出现 }- 对于每个数字
num,我们将它放到应该在的位置(即num-1的位置)。如果num在数组范围内并且当前位置的数字是正数,就将该位置标记为负数,表示该数值已出现。
- 对于每个数字
-
查找缺失的最小正整数:
if (nums[i] > 0) {return i + 1; // 返回缺失的第一个正整数 }- 如果遍历完数组后,遇到第一个正数,说明该索引对应的正整数是缺失的最小正整数。
-
返回结果:
- 如果所有
1到numsLen的整数都已经出现,则返回numsLen + 1。
- 如果所有
复杂度分析
- 时间复杂度:
O(n),其中n是数组的长度。我们遍历数组三次:一次处理无效值,一次进行就地交换,一次查找缺失的最小正整数。 - 空间复杂度:
O(1),除了输入数组外,没有使用额外的空间,所有操作都在原数组上进行。
总结
难得的一道简单的题目。。
相关文章:
每日一题——缺失的第一个正整数
缺失的第一个正整数 题目描述进阶:数据范围: 示例示例 1示例 2示例 3 题解思路代码实现代码解释复杂度分析总结 题目描述 给定一个无重复元素的整数数组 nums,请你找出其中没有出现的最小的正整数。 进阶: 时间复杂度ÿ…...
CEF132 编译指南 MacOS 篇 - 基础开发工具安装实战 (二)
1. 引言 在 macOS 平台上编译 CEF132 之前,首要任务是搭建一个完善的开发环境。与 Windows 和 Linux 环境不同,macOS 的开发环境主要以 Xcode 为核心。本篇将作为 CEF132 编译指南系列的第二篇,详细指导读者如何在 macOS 系统上安装和配置 X…...
vi 是 Unix 和 Linux 系统中常用的文本编辑器
vi是 Unix 和 Linux 系统中常用的文本编辑器,它有几种不同的模式,其中最常用的是命令模式和插入模式。光标控制主要在命令模式下进行,以下是一些常用的vi命令来控制光标位置: • h,j,k,l:分别用于将光标向左、向下、向…...
SwanLab x verl:可视化LLM强化学习后训练教程
文章目录 介绍Verl和SwanLab1. 环境安装2. 使用方法3. 查看训练日志 介绍Verl和SwanLab verl 是一个灵活、高效且可用于生产环境的强化学习(RL)训练框架,专为大型语言模型(LLMs)的后训练设计。它由字节跳动火山引擎团…...
职场到校园,初心未改:我的2024年
Hi,大家好,我是几何心凉。 其实早就想写一份复盘文章,正好借助2024年度博客之星的评选机会,来写下这篇总结。回望过去,感慨颇多。自从加入CSDN平台以来,已经见证了许多博主的来去匆匆,各类创作…...
C++基础知识学习记录—引用
1、引用的概念 概念:引用相当于给变量取个别名 对引用进行操作与直接操作变量相同,注意引用类型与变量类型一致 #include<iostream> using namespace std; int main(){int a10;int& cite_a a;//操作引用cite_a 与操作变量a完全一样cout &l…...
AWS Savings Plans 监控与分析工具使用指南
一、背景介绍 1.1 什么是 Savings Plans? AWS Savings Plans 是一种灵活的定价模式,通过承诺持续使用一定金额的 AWS 服务来获得折扣价格。它可以帮助用户降低 AWS 使用成本,适用于 EC2、Fargate 和 Lambda 等服务。 1.2 为什么需要监控? 优化成本支出跟踪使用情况评估投…...
【AI学习】关于 DeepSeek-R1的几个流程图
遇见关于DeepSeek-R1的几个流程图,清晰易懂形象直观,记录于此。 流程图一 来自文章《Understanding Reasoning LLMs》, 文章链接:https://magazine.sebastianraschka.com/p/understanding-reasoning-llms?continueFlagaf07b1a0…...
C++ ——从C到C++
1、C的学习方法 (1)C知识点概念内容比较多,需要反复复习 (2)偏理论,有的内容不理解,可以先背下来,后续可能会理解更深 (3)学好编程要多练习,简…...
【图片转换PDF】多个文件夹里图片逐个批量转换成多个pdf软件,子文件夹单独合并转换,子文件夹单独批量转换,基于Py的解决方案
建筑设计公司在项目执行过程中,会产生大量的设计图纸、效果图、实景照片等图片资料。这些资料按照项目名称、阶段、专业等维度存放在多个文件夹和子文件夹中。 操作需求:为了方便内部管理和向客户交付完整的设计方案,公司需要将每个项目文件…...
前端学习之Flex布局
<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Flex布局示例</title><style>.conta…...
游戏引擎学习第97天
回顾昨天并计划今天 在这期节目中,主要讲解了光照的概念,并进一步讨论了法线贴图光照的实现。节目的内容大致分为几个部分: 光照的基础概述:讨论了光的工作原理以及如何在编程图形时需要考虑光照问题。尽管这些概念并没有深入到…...
Mysql中存储引擎各种介绍以及应用场景、优缺点
概述 MySQL 提供了多种存储引擎,每种引擎有不同的特点和适用场景。以下是几种常见的 MySQL 存储引擎的详细介绍,包括它们的底层工作原理、优缺点,以及为什么 MySQL 默认选择某种引擎。 1. InnoDB 底层工作原理: 事务支持&#…...
PHP 运算符
PHP 运算符 概述 PHP 是一种广泛使用的开源服务器端脚本语言,它具有丰富的运算符集,这些运算符是编写 PHP 程序的基础。运算符用于执行各种数学、逻辑和比较操作。本篇文章将详细介绍 PHP 中常用的运算符,包括算术运算符、比较运算符、逻辑运算符、赋值运算符等。 算术运…...
Vue全流程--Vue3.0与Vue2.0响应式原理对比
Vue2中数据的响应式 需要使用Vue.set这么一个api,修改数据 需要使用Vue.delete这么一个api,删除数据 数据代理这个当面的理解可以看看我前面文章Vue全流程--数据代理的理解以及在Vue中的应用-CSDN博客 Vue3中数据的响应式 Vue3使用proxy这个api实现…...
C语言学习笔记:子函数的调用实现各个位的累加和
在C语言程序学习之初,我们都会学习如何打印 hello world,在学习时我们知道了int main()是主函数,程序从main函数开始执行,这是流程控制的一部分内容。在主函数中我们想要实现一些功能,比如求各个…...
【大模型】本地部署DeepSeek-R1:8b大模型及搭建Open-WebUI交互页面
本地部署DeepSeek-R1:8b大模型 一、摘要及版本选择说明1.1 摘要1.2 版本选择 二、下载并安装Ollama三、运行DeepSeek-R1:8b大模型四、安装Open WebUI增强交互体验五、关闭Ollama开机自动启动六、DeepSeek大模型启停步骤 一、摘要及版本选择说明 1.1 摘要 作为一名对 AI 和生成…...
Python 调用 Stabilityai API在本地生成图像
Python 调用 Stabilityai API在本地生成图像 摘要功能 代码结构关键技术代码下载立即体验 摘要 本程序利用硅基流动目前的免费 stabilityai/stable-diffusion-2-1 模型API,生成图像并下载到本地,用户可以通过输入描述性提示词来获取相应的图像。使用Pyt…...
Python3中异常处理:try-finally语句的示例
一. 简介 前面一篇文章简单学习了 try-finally语句结构,执行过程、以及使用场景。文章如下: Python3中异常处理:try-finally语句-CSDN博客 本文写一些简单的示例来继续学习 try-finally语句的使用。 二. Python3中异常处理:try…...
Lua限流器的3种写法
学而不思则罔,思而不学则殆 引言 上篇文章讲解了Lua脚本,事务和Pipline之间的使用方式和性能差距,本篇文章将聚焦Lua脚本,我将用三种写法来展现如何实现一个Redis限流器 固定窗口限流 固定窗口限流也是最简单的限流算法&#x…...
特朗普政府发布《国家人工智能立法框架》,多维度布局AI领域
【《国家人工智能立法框架》六大核心目标锚定AI发展方向】特朗普政府发布的《国家人工智能立法框架》,意在通过统一国家政策确保美国在AI领域的全球领先地位。该框架包含六大核心目标,分别是保护儿童与赋能家长、维护与强化美国社区、尊重知识产权与支持…...
AD5144A数字电位器I²C驱动库深度解析与工程实践
1. AD5144A数字电位器驱动库深度解析:面向嵌入式工程师的IC控制实践指南AD5144A是ADI公司推出的四通道非易失性数字电位器,属于AD51xx系列中功能完备、应用灵活的代表型号。该器件通过IC接口实现对四个独立通道的精确电阻调节,支持256级&…...
电路设计与漫画艺术的跨界融合
1. 当电路遇见漫画:工程师的艺术表达在大多数人眼中,电路设计是冰冷的数据和复杂的公式,而漫画则是天马行空的创意表达。但作为一名从业十年的硬件工程师,我发现这两者其实有着惊人的相似之处——它们都需要严谨的结构设计&#x…...
快速原型构建遇阻?用快马AI一键绕过npm error 128,聚焦核心功能验证
最近在尝试用Node.js快速验证一个Web服务原型时,遇到了烦人的npm error code 128问题。这个错误通常和Git仓库权限相关,会直接卡住依赖安装流程。经过一番折腾,我总结出一套在InsCode(快马)平台快速绕开这个坑的实践方案,分享给同…...
救命!电路板维修高频故障排查口诀,背会秒上手,修板快准稳
修板半天没头绪?工控伺服板一修就慌?测遍元件还烧板?其实电路板故障排查不用死磕,一套好记的速记口诀,能帮你少走弯路、少赔成本,新手能快速上手,老手直接拉高效率,刷到这篇干货&…...
Agent设计模式学习(基于langchain4j实现)(6) - 组合复杂工作流
一、定义Agent 1.1 CandidateWorkflow 1 public interface CandidateWorkflow { 2 Agent("根据个人履历和职位描述生成主简历,通过反馈循环针对职位描述进行定制,直至达到合格分数") 3 String processCandidate(V("lifeStory&q…...
3大优化方案让经典游戏重获新生:WarcraftHelper解决老游戏新设备适配难题
3大优化方案让经典游戏重获新生:WarcraftHelper解决老游戏新设备适配难题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 当你在4K显示器上…...
3步搞定电脑风扇噪音!FanControl风扇控制软件完全指南,让你的电脑从此安静如新!
3步搞定电脑风扇噪音!FanControl风扇控制软件完全指南,让你的电脑从此安静如新! 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项…...
跨设备追番终极指南:3步配置Kazumi WebDAV数据同步
跨设备追番终极指南:3步配置Kazumi WebDAV数据同步 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP,支持流媒体在线观看,支持弹幕,支持实时超分辨率。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi 还在为手…...
AI绘画模型训练完全指南:3大核心优势与零代码实践
AI绘画模型训练完全指南:3大核心优势与零代码实践 【免费下载链接】sd-trainer 项目地址: https://gitcode.com/gh_mirrors/sd/sd-trainer Stable Diffusion训练技术已成为AI绘画领域的核心能力,但传统训练流程复杂、配置繁琐,让许多…...
