力扣-hot100 (缺失的第一个正数)

41. 缺失的第一个正数

困难

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

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

示例 1:

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

解释:范围 [1,2] 中的数字都在数组中。


示例 2:

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

解释:1 在数组中,但 2 没有。
 

示例 3:

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

解释:最小的正数 1 没有出现。

提示:

1 <= nums.length <= 105

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

思路:直接使用Hash表来记录下每个数, 预处理后再去检查1 ~ n + 1 缺失的数.【时间复杂度O(n) 空间复杂度O(n)】 而题目要求空间复杂度O(1)

解决关键: 数组本身是有两个位置可以记录数据的数据结构,一个是索引下标,另一个就是值. 利用这一点来实现常数级别空间复杂度的解决

这里将每个遍历到的值都将数组的索引做一个标记 (为了不影响这个数本身的价值,将其标为负数, 用到该数时再取绝对值, 但如果这里原来数组的数本来就是负数呢? 这里是要找缺失的第一个正数,负数是没有价值的, 所以我们可以将初始就为负数的数替换为一个特定的数. 为了不影响结果, 这个特定的数是要保证是存在的, 所以我们可以将其替换为 1 ~ n+1 的任何数, 只要在预处理的时候检查他存在, 但题目要求的是需要第一个正数, 故如果选择后面的数会出现漏掉前面较小的数的检查. 所以最小数1是你的不二选择)。 用索引下标表示这个数已经存在, 处理完后只需要找到这个数组的第一个正数, 他的下标就是第一个没有出现的正数。而缺失的数肯定在1 ~ n+1 之间的。如果都为负数则缺失的就是 n+1

class Solution {public int firstMissingPositive(int[] nums) {int n = nums.length;// 检查负数的最小标记是否存在 1boolean std = false;for(int i = 0; i < n; i ++) if(nums[i] == 1) std = true;// 不存在直接返回第一个缺失的正数 1if(!std) return 1;// 预处理,为了不让初始值为负数的数干扰后序检查的结果. 将无意义的负数都标记为已经存在的 1for(int i = 0; i < n; i ++) if(nums[i] <= 0) nums[i] = 1;// 将存在的数全都标负, 数组下标是从0开始的, 所以处理时都进行 -1for(int i = 0; i < n; i ++){int t = Math.abs(nums[i]);// 缺失的数只在1 ~ n+1 之间, 超过范围的其它数不需要处理if(t <= n) nums[t - 1] = -Math.abs(nums[t - 1]);}// 找到第一个正数for(int i = 0; i < n; i ++){// 找到时进行 + 1 恢复if(nums[i] > 0) return i + 1;}return n + 1;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

13前端项目----购物车修改

购物车修改 uuid临时游客身份购物车部分功能全选修改商品数量修改商品勾选状态删除产品 uuid临时游客身份 请求数据仓库发起请求 ->问题&#xff1a;获取不到购物车数据&#xff1f; 所以需要一个身份&#xff0c;告诉服务器是谁存的数据&#xff1f;是要获取谁的数据&…

Mac电脑,idea突然文件都展示成了文本格式,导致ts,tsx文件都不能正常加载或提示异常,解决方案详细说明如下

有一天使用clean my mac软件清理电脑 突然发现idea出现了文件都以文本格式展示&#xff0c;如图所示 然后就卸载&#xff0c;计划重新安装&#xff0c;安装了好几个版本&#xff0c;并且setting->file types怎么设置都展示不对&#xff0c;考虑是否idea没卸载干净&#xff…

Nginx搭建test服务器

创建test域名 进入阿里云添加解析 创建域名:test.xxxxx.com 服务器复制项目代码 新建目录,Git拉取项目代码,安装上插件包 修改配置文件,启动测试服务 修改配置文件“服务器接口” 开启服务pm2 start app.js --name "test" 表格含义: 列名含义说明id进程在…

MyBatis-Plus 非 Spring 环境使用时 `GenericTypeResolver` 缺失问题总结

MyBatis-Plus 非 Spring 环境使用时 GenericTypeResolver 缺失问题总结 问题描述 在非 Spring 环境中使用 MyBatis-Plus 3.4.3.1 及以上版本时&#xff0c;启动程序会抛出以下错误&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: org/s…

综合案例:使用vuex对购物车的商品数量和价格等公共数据进行状态管理

文章目录 0.实现需求1.新建购物车模块cart2.使用json-server模拟向后端请求数据3.在vuex请求获取并存入数据,并映射到组件中,在组件中渲染【重点】3.1.安装axios3.2.准备actions和mutations,获取和存入数据到vuex中3.3.动态渲染:先用mapState映射list到组件页面 4.点击修改数量…

《数据结构初阶》【顺序表 + 单链表 + 双向链表】

《数据结构初阶》【顺序表 单链表 顺序表】 前言&#xff1a;先聊些其他的东西&#xff01;&#xff01;&#xff01;什么是线性表&#xff1f;什么是顺序表&#xff1f;顺序表的种类有哪些&#xff1f; 什么是链表&#xff1f;链表的种类有哪些&#xff1f; ---------------…

Android Retrofit框架分析(三):自动切换回主线程;bulid的过程;create方法+ServiceMethod源码了解

目录 Okhttp有什么不好&#xff1f;bulid的过程create方法ServiceMethodcall enqueue的过程为什么要学习源码呢&#xff1f; 一、Okhttp有什么不好&#xff1f; Okhttp本身来说&#xff0c;是一个挺好的网络框架&#xff0c;但&#xff0c;对于开发者而言&#xff0c;使用起…

C++ STL 基础与多线程安全性说明文档

C STL 基础与多线程安全性说明文档 一、STL 简介 STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;是 C 标准库的重要组成部分&#xff0c;提供了常用的数据结构和算法的泛型实现&#xff0c;极大地提高了代码的复用性和开发效率。 STL 的六大组…

数据结构之图的分类和存储

图 图(Graph)G由两个集合V和E组成&#xff0c;记为&#xff1a;G(V,E)&#xff0c;其中V是顶点的有穷非空集合(其实就是顶点)&#xff0c;E是V 中顶点偶对的有穷集合(就是边)。V(G)和E(G)通常分别表示图G的顶点集合以及边集合&#xff0c;E(G)可以为空集合&#xff0c;但是此时…

扩增子分析|微生物生态网络稳定性评估之鲁棒性(Robustness)和易损性(Vulnerability)在R中实现

一、引言 周集中老师团队于2021年在Nature climate change发表的文章&#xff0c;阐述了网络稳定性评估的原理算法&#xff0c;并提供了完整的代码。自此对微生物生态网络的评估具有更全面的指标&#xff0c;自此网络稳定性的评估广受大家欢迎。本系列将介绍网络稳定性之鲁棒性…

setup 函数在 Vue 3 中的作用是什么?什么时候会执行

文章目录 前言✅ 一、setup() 函数的作用是什么&#xff1f;✅ 二、setup() 什么时候执行&#xff1f;✅ 三、setup() 的参数✅ 四、setup() 中不能做什么&#xff1f;✅ 五、常见用法示例✅ 六、总结&#xff08;适合背诵或面试回答&#xff09; <script setup> 是 **Vu…

JDBC实现--保姆级教程~

本来以为写过一个使用python与数据库连接的文章&#xff0c;但是今天突然发现没有&#xff0c;那就直接写Java与数据库连接的吧。当然如果大家有需要可以告诉我&#xff0c;有时间的话也可以写一个的pymysql的使用的。 数据库有很多种&#xff0c;接下来我就以MySQL为例来进行讲…

Ubuntu18.04搭建samda服务器

一.什么是Samba服务器&#xff1f; Samba服务器是一种基于开源协议实现的网络共享服务软件&#xff0c;主要用于在不同操作系统&#xff08;如Windows、Linux、Unix&#xff09;之间实现文件和打印机共享功能。其核心目标是解决跨平台资源共享的兼容性问题&#xff0c;尤其是在…

《分词算法大揭秘:BPE、BBPE、WordPiece、ULM常见方法介绍》

分词算法是自然语言处理&#xff08;NLP&#xff09;中的一个重要预处理步骤&#xff0c;它将文本分割成更小的单元&#xff08;如单词、子词或字符&#xff09;。以下是几种常见的分词算法&#xff1a;Byte Pair Encoding (BPE)、Byte-level BPE (BBPE)、WordPiece 和 Unigram…

WordPress01 - 后台常用功能

最近些日子研究Wordpress&#xff0c;做些简单的笔记。 怎么安装Wordpress&#xff0c;怎么进的后台&#xff0c;这些咱就不唠了哈&#xff0c;网上到处是教程。 目录 1&#xff0c;Wordpress的后台 1-1&#xff0c; Posts(投稿) 1-2&#xff0c;Media(媒体) 1-3&#xf…

R8周:RNN实现阿尔茨海默病诊断

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 一、前期准备 1.设置GPU import numpy as np import pandas as pd import torch from torch import nn import torch.nn as nn import torch.nn.functi…

今天python练习题

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 不要害怕失败&#xff0c;失败可能成为我们前进的动力&#xff01; 二、练习题 有列表lst [[1,2,3],[4,5,6],[7,8,9]],取出其中的元素1/5/9组成新的列表 # 有列表lst [[1,2,3],[4,5,6],[…

机器人强化学习入门学习笔记(二)

基于上一篇的《机器人强化学习入门学习笔记》,在基于 MuJoCo 的仿真强化学习训练中,除了 PPO(Proximal Policy Optimization)之外,还有多个主流强化学习算法可用于训练机器人直行或其他复杂动作。 🧠 一、常见强化学习算法对比(可用于 MuJoCo) 算法类型特点适合场景PP…

用 DuckDB 高效分析 JSON 数据:从入门到实战

解析 JSON 文件进行分析常常充满挑战。无论你是在处理 API 响应、日志文件&#xff0c;还是应用数据&#xff0c;如果没有合适的工具&#xff0c;分析 JSON 都会非常耗时。 借助 DuckDB&#xff0c;你可以直接用 SQL 查询复杂的 JSON 文件&#xff0c;无需编写复杂的解析代码或…

从贴牌到品牌:出海官网如何让中国制造“贵”起来?

在全球经济一体化的当下&#xff0c;中美关税战如同一记重锤&#xff0c;给国际贸易格局带来了巨大震荡。自贸易摩擦爆发以来&#xff0c;双方多次调整关税政策&#xff0c;涉及的商品种类不断增多&#xff0c;税率持续攀升&#xff0c;众多中国企业的出口业务遭受重创&#xf…