2021-08-30缺失的第一个正数
给你一个未排序的整数数组 nums
,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n)
并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0] 输出:3
示例 2:
输入:nums = [3,4,-1,1] 输出:2
方法二:置换
除了打标记以外,我们还可以使用置换的方法,将给定的数组「恢复」成下面的形式:
如果数组中包含 x∈[1,N],那么恢复后,数组的第x−1 个元素为 x。
在恢复后,数组应当有 [1, 2, ..., N] 的形式,但其中有若干个位置上的数是错误的,每一个错误的位置就代表了一个缺失的正数。以题目中的示例二 [3, 4, -1, 1] 为例,恢复后的数组应当为 [1, -1, 3, 4],我们就可以知道缺失的数为 2。
那么我们如何将数组进行恢复呢?我们可以对数组进行一次遍历,对于遍历到的数x=nums[i],如果 x∈[1,N],我们就知道 x 应当出现在数组中的 x−1 的位置,因此交换 nums[i] 和nums[x−1],这样 xx 就出现在了正确的位置。在完成交换后,新的 nums[i] 可能还在 [1,N] 的范围内,我们需要继续进行交换操作,直到 。
注意到上面的方法可能会陷入死循环。如果nums[i] 恰好与nums[x−1] 相等,那么就会无限交换下去。此时我们有,说明 x 已经出现在了正确的位置。因此我们可以跳出循环,开始遍历下一个数。
由于每次的交换操作都会使得某一个数交换到正确的位置,因此交换的次数最多为 NN,整个方法的时间复杂度为 O(N)O(N)。
class Solution:def firstMissingPositive(self, nums: List[int]) -> int:n = len(nums)for i in range(n):while 1 <= nums[i] <= n and nums[nums[i] - 1] != nums[i]:nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]for i in range(n):if nums[i] != i + 1:return i + 1return n + 1
class Solution:def firstMissingPositive(self, nums: List[int]) -> int:n =len(nums)for i in range(n):while 1<= nums[i] <=n and nums[nums[i]-1] != nums[i]:nums[nums[i]-1], nums[i]=nums[i],nums[nums[i]-1]for i in range(n):if nums[i] != i+1:return i+1return n+1
class Solution:def firstMissingPositive(self, nums:List[int]) -> int:n = len(nums)for i in range(n):while 1<= nums[i] <= n and nums[nums[i]-1] != nums[i]:nums[nums[i]-1], nums[i] = nums[i], nums[nums[i] -1]for i in range(n):if nums[i] != i+1:return i+1return n+1
class Solution:def firstMissiongPositive(self, nums: List[int]) -> int:n = len(nums)for i in range(n):while 1<= nums[i] <= n and nums[num[i]-1] != num[i]:nums[nums[i] -1], nums[i] -nums[i], nums[nums[i]-1]fro i in range(n):if nums[i] != i+1:return i+1return n+1
class Solution:def firstMissingPositive(self, nums: List[int]) -> int:n= len(nums)for i in range(n)while 1<= nums[i] <= n and nums[nums[i] -1] != nums[i]:nums[nums[i] -1], nums[i] = nums[i], nums[nums[i]-1]for i in range(n):if nums[i] != i+1:return i+1return n+1
class Solution:def firstMissingPositive(self, nums: List[int]) -> int:n = len(nums)for i in range(n):if nums[i] <= 0:nums[i] = n + 1for i in range(n):num = abs(nums[i])if num <= n:nums[num - 1] = -abs(nums[num - 1])for i in range(n):if nums[i] > 0:return i + 1return n + 1
class Solution:def firstMissingPositive(self,nums: List[int]) -> int:n =len(nums)for i in range(n):if nums[i] <=0:nums[i] = n+1for i in range(n):num =abs(nums[i])if num < =n:nums[num-1] = -abs(nums[num-1])for i in range(n):if nums[i] >0:return i+1return n+1
class Solution:def firstMissingPositive(self, nums: List[int]) -> int:n = len(nums)for i in range(n):if nums[i] <=0:nums[i] =n+1for i in range(n):nums = abs(nums[i])if num<=n:nums[num -1] = -abs(nums[num -1])for i in range(n):if nums[i]> 0:return i+1return n+1
2021-08-30缺失的第一个正数相关推荐
- Leetcode 40组合总数(回溯)Ⅱ41缺失的第一个正数42接雨水
维护公众号:bigsai ,回复进群加入打卡,回复bigsai分享一些学习资源! 上周第一次 LeetCode 36有效的数独&37解数独(八皇后问题) 上周第二次 LeetCode 38外观 ...
- 41. 缺失的第一个正数 golang
41. 缺失的第一个正数 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3 ...
- LeetCode--41.缺失的第一个正数(C)
缺失的第一个正数(C) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 申请额外空间实现 3.2 原数组实现 1. 题目描述 难度:困难 2. 题目分析 这道题本质上是很简单的,但是加上了这 ...
- Java实现 LeetCode 41 缺失的第一个正数
41. 缺失的第一个正数 给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: ...
- Leetcode算法Java全解答--41. 缺失的第一个正数
Leetcode算法Java全解答–41. 缺失的第一个正数 文章目录 Leetcode算法Java全解答--41. 缺失的第一个正数 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 ...
- 41. First Missing Positive 缺失的第一个正数
Title 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [ ...
- 努力前端【LeetCode-10】448. 找到所有数组中消失的数字 442. 数组中重复的数据(中等) 41. 缺失的第一个正数(困难) [鸽笼原理,数组,Map,类似No.645]
文章目录 题目描述-448 一.哈希Map 二.空间复杂度的优化--鸽笼原理 三.总结 题目描述-442 一.还是hashMap 二.继续鸽笼原理 题目描述-41 一.基础方案 二.数组模拟Map 题 ...
- Leetcode--41. 缺失的第一个正数
给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11 ...
- 【LeetCode笔记】41. 缺失的第一个正数(Java、哈希)
文章目录 题目描述 思路 & 代码 题目描述 难点在于时空复杂度的要求 想出最优方法,需要认真理解题目. 思路 & 代码 做法:建立一个逻辑上的哈希表,令 nums[i] = i + ...
- 41,缺失的第一个正数
解题思路 一,暴力肯定不可取,时间要O(n^2) 二,sort一遍也不行,空间要O(n) 三,时间要O(n),空间常数,只能找方法. 可以想到,如果每个数字刚好对应那个 空间地址(nums[i]==i ...
最新文章
- GDB 格式化结构体输出
- H5中使用Web Storage来存储结构化数据
- 关于ZipOupputStream添加压缩包常见问题
- 关于解决jdbc版本错误问题
- 从Oracle到PostgreSQL:最全控制文件
- js (jQuery) 之 取值
- linux里车目录是什么意思,linux 命令整理
- 解决微信浏览器不能自动播放视频
- EXCEL 批量插入指标批注
- 京东3元无门槛优惠券变京豆
- 技术干货丨《大天使之剑H5》主程与项目总监:H5游戏的压缩与优化经验
- 内蒙古计算机考研学校选择,2020内蒙古考研指南-这些没有A+的院校你会选择吗...
- Java 输出1-100之内的所有质数
- win11更新后任务栏空白电脑卡死怎么办?
- 重新思考 视频超分辨 Transformers 中的对齐
- solidity第一课—了解Remix和Hellosolidity三行代码
- 史上最全 Appium 自动化测试从基础到框架实战精华学习笔记(一)
- 第一章 初识Java总结
- ftp登录shell为nologin无法登录
- 考研经历,川大(网络空间安全)
热门文章
- php 回调cache 方案,基于PHP的一种Cache回调与自动触发技术
- ajajx请求php能设置cookie,为什么在AJAX请求返回后浏览器没有设置cookie?
- 【转】NodeJs使用Mysql模块实现事务处理
- spring cloud gateway 源码解析(4)跨域问题处理
- 阿里的Atlas组件化框架
- Android 通过Base64上传图片到服务器
- mysql 查询一年中每个月份的数据量
- VMware OSP对比VMware Tools:简化Linux驱动更新
- 如何对系统日志中事件 ID 9、事件 ID 11 和事件 ID 15 错误消息进行故障排除
- Linux学习——gcc编译C程序