【LeetCode笔记】41. 缺失的第一个正数(Java、哈希)

文章目录

  • 题目描述
  • 思路 & 代码

题目描述

  • 难点在于时空复杂度的要求
  • 想出最优方法,需要认真理解题目。
    在这里插入图片描述

思路 & 代码

  • 做法:建立一个逻辑上的哈希表,令 nums[i] = i + 1,比如 nums[0] = 1。那么第一个不符合这个要求的元素的下标 + 1就是答案。
  • 因为要找的是“第一个未出现的正数”,所以有:
    (1) 对于应放位置超出范围的值,我们先不处理:比如[1, 100, 3, -1] 里的 100、-1
    (2) 对于可以放的值,如果当前位置还不是正确的值(考虑重复),就进行交换。
  • 边界判断:全都满足的情况,比如[1, 2, 3],取nums.length + 1。
class Solution {public int firstMissingPositive(int[] nums) {// 1. 排序遍历:O(n*logn) O(1)// 2. HashSet:O(n) O(n)// 3. 数组转化成逻辑上的哈希表,nums[i] = i + 1:还是需要再理解理解for(int i = 0; i < nums.length; i++){// 把当前值交换到应当的位置,由于当前值更新,继续这个过程,直到当前值就是正确位置 // 或当前值超出范围// 第三个判断条件:考虑重复值while(nums[i] > 0 && nums[i] <= nums.length && nums[i] != nums[nums[i] - 1]){int temp = nums[nums[i] - 1];nums[nums[i] - 1] = nums[i];nums[i] = temp;}}// 在建立好的逻辑上哈希表上,遍历找到答案for(int i = 0; i < nums.length; i++){if(nums[i] != i + 1){return i + 1;}}// 边界,全都满足的情况。return nums.length + 1;}
}
  • 无注释版
  • 核心思路:还是构建哈希表,while循环是关键
class Solution {public int firstMissingPositive(int[] nums) {for(int i = 0; i < nums.length; i++){while(nums[i] > 0 && nums[i] <= nums.length && nums[i] != nums[nums[i] - 1]){int temp = nums[nums[i] - 1];nums[nums[i] - 1] = nums[i];nums[i] = temp;}}for(int i = 0; i < nums.length; i++){if(nums[i] != i + 1){return i + 1;}}return nums.length + 1;}
}

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

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

相关文章

笔记本电脑如何保养_电脑保养只是吹一吹?别再被骗了,电脑没做这些就等于没保养...

汽车大约跑5000KM就需要保养一次&#xff0c;电脑与汽车一样&#xff0c;在使用一定时间的时候也需要保养一次&#xff0c;电脑保养对于很多朋友来说还是很陌生的&#xff0c;在这里小编就给大家做一个简单的科普&#xff0c;电脑保养主要指的是清理灰尘与更换硅脂&#xff0c;…

【LeetCode笔记】199. 二叉树的右视图(Java、二叉树、层序遍历)

文章目录题目描述思路 & 代码题目描述 挺简单的&#xff0c;直接看思路代码吧。 思路 & 代码 就是一个层序遍历&#xff0c;取每层的最右边结点即可 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* T…

ibm笔记本电脑电池_笔记本电池怎么充电 笔记本电脑电池充电方法【详解】

笔记本电脑以其精致小巧的外形、方便携带的特点&#xff0c;受到了众多人士的喜爱。在 办公室 没有完成的工作&#xff0c;可以随时带到家中去完成&#xff0c;它的存在就是为了我们能有便捷的办公模式。那么对于这个日夜陪伴我们的好物件大家都是怎么充电的呢&#xff1f;方法…

电脑键盘下划线怎么打_图文详解笔记本电脑键盘失灵怎么办

相信有很多朋友都遇到过笔记本键盘失灵的情况&#xff0c;其实笔记本键盘失灵的问题是可大可小的&#xff0c;下面小编就给大家详细介绍关于怎么解决笔记本电脑失灵的操作方法&#xff0c;让大家在遇到问题时自己就能够解决这些问题。方法一。1。右键单击桌面右下角的输入方法&…

【LeetCode笔记】69. x 的平方根(Java、二分)

文章目录题目描述思路 & 代码更新版题目描述 本质&#xff1a;找满足 k * k < x 的最大 k 思路 & 代码 二分&#xff0c;对满足 k * k < x 的最大 k进行查找。注意极端数据&#xff0c;用 long暴力法先来一个 class Solution {public int mySqrt(int x) {in…

opencv 模板匹配_详细剖析模板匹配

点击上方“新机器视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达模板匹配介绍我们需要2幅图像&#xff1a;原图像 (I): 在这幅图像里,我们希望找到一块和模板匹配的区域模板 (T): 将和原图像比照的图像块模板匹配就是在整个图像区域发现…

【LeetCode笔记】143. 重排链表(Java、链表、栈、快慢指针)

文章目录题目描述思路 & 代码更新版&#xff1a;快慢指针 翻转链表题目描述 一看题目反序&#xff1a;用栈更新&#xff1a;O(1) 空间复杂度 思路 & 代码 先快慢指针&#xff0c;找到需要入栈的起点&#xff0c;然后逐个入栈然后逐个出栈&#xff0c;进行重排即可…

hdfs中与file数组类似的数组_如何在 JavaScript 中克隆数组

作者&#xff1a;Yazeed Bzadough译者&#xff1a;allenJavaScript 有很多方法可以做任何事情&#xff0c;现在我们研究数组。1.扩展运算符(浅拷贝)自从 ES6 发布以来&#xff0c;这一直是最受欢迎的方法。这是一个简短的语法&#xff0c;你会发现它在使用像 React 和 Redux 这…

【LeetCode笔记】54. 螺旋矩阵(Java、迭代、递归)

文章目录题目描述思路 & 代码递归迭代更新版 - 递归题目描述 递归和迭代都实现了&#xff0c;递归相对比较好理解&#xff0c;也比较好实现 思路 & 代码 递归 每次都把最外圈的元素跑完一行 or 一列的时候&#xff0c;跑一次结束边界&#xff1a;left > right …

ubuntu boot空间不足_安装 Ubuntu 双系统

在很久以前就想试一试Linux了&#xff0c;一直没有实践。一是觉得太麻烦&#xff0c;二是怕把电脑弄坏。后来实践了一次后发现&#xff0c;其实并没有想象中那么难&#xff0c;这是一个完全独立的系统&#xff0c;与隔壁的Windows半毛钱关系都没有。把引导搞定就不怕了。另外&a…

【LeetCode笔记】112 113. 路径总和 I II(Java、递归、DFS)

文章目录路径总和 I路径总和 II比较简单&#xff0c;就连着一起写了 路径总和 I 注意&#xff1a;一定得走到叶子才算 直接看代码吧&#xff0c;注释也就几行。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* T…

安装python环境与运行_linux下怎么安装python的运行环境

展开全部 1、2113linux下安装python3 a、 准备编译环境(环境如果不对的5261话&#xff0c;可能遇到各种问题&#xff0c;比如wget无法下4102载1653https链接的文件)1 2 yum groupinstall Development Tools yum install zlib-devel bzip2-devel openssl-devel ncurses-devel2 下…

【LeetCode笔记】437. 路径总和III(Java、双重递归、二叉树)

文章目录题目描述思路 & 代码题目描述 说实话确实比I & II要恶心一点这里直接用双递归秒了&#xff08;今天才发现我是之前先写的III&#xff0c;再写的I & II&#xff09;有前缀和的写法&#xff0c;但是懒得整了 思路 & 代码 和之前不同&#xff0c;这里…

python中break和continue的区别_python中break和continue的区别

原博文 2017-08-01 09:56 − break和continue 1.break 意思为结束循环 例&#xff1a; i 0 while i<10: i1 if i5: #当i5时&#xff0c;结束整个循环 ...030778 相关推荐 2019-12-20 11:37 − 1、break break的使用场景&#xff1a;循环语句和switch-case分支语句。 它的作…

【LeetCode笔记】128. 最长连续序列(Java、哈希表、动态规划)

文章目录题目描述思路 & 代码变式题&#xff1a;返回答案数组更新可恶。。居然碰到了周一面试没撕出最优复杂度的题 题目描述 难点在于时间复杂度O(n)&#xff0c;否则来个sort()还是很轻松的 思路 & 代码 一般来说&#xff0c;时间复杂度可以用空间复杂度来弥补&a…

【LeetCode笔记】148. 排序链表(Java、归并排序、快慢指针、双重递归)

文章目录题目描述思路 & 代码二刷题目描述 难点在于时空复杂度的要求 思路 & 代码 转化成&#xff1a;归并排序 合并两个有序链表 即可利用快慢指针来拆分成两条链表注意&#xff1a;链表的拆分 & 连接时间复杂度O(n * logn)&#xff0c;空间复杂度 O(1) /**…

java substring截取字符串_lt;12gt;深入了解字符串

深入了解字符串完整视频教程&#xff1a;Java轻松入门经典教程[柠檬学院]-学习视频教程-培训课程-腾讯课堂​ke.qq.com字符串主要用于编程&#xff0c;用于概念说明、函数解释、用法详述等&#xff0c;字符串在存储上类似于字符数组&#xff0c;所以它的每一个单元都是可以提取…

【LeetCode笔记】88. 合并两个有序数组(Java、双指针)

文章目录题目描述思路 & 代码更新题目描述 比较简单&#xff0c;直接看思路吧&#xff01; 思路 & 代码 从后往前进行填数即可&#xff08;正确性可以保证&#xff09;时间复杂度 O(n) class Solution {public void merge(int[] nums1, int m, int[] nums2, int n…

thymealf如何实现传单个变量给html_梦回2013,看尤大vue的第一行代码,如何用30行代码实现vue(超简洁,适合初学者)...

非非非标题党&#xff0c;干货预警&#xff01;&#xff01;&#xff01;介绍大家好&#xff0c;我是清池交友 app 开发日记&#xff0c;记录清池交友 app 开发中学习过程和踩坑日记&#xff0c;伪全栈[1]技术栈&#xff1a;前端 js&#xff0c;vue&#xff0c;uniapp&#xff…

【LeetCode笔记】142. 环形链表 II(Java、快慢指针)

文章目录题目描述思路 & 代码更新版三刷 - 再更新题目描述 相对于环形链表&#xff0c;这里要求找到环的起点难点在于 O(1)&#xff0c;否则可以直接哈希表冲 思路 & 代码 找出快慢指针的路程关系&#xff0c;得出结论&#xff08;详见代码注释&#xff09; /*** …