给你一个未排序的整数数组 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缺失的第一个正数相关推荐

  1. Leetcode 40组合总数(回溯)Ⅱ41缺失的第一个正数42接雨水

    维护公众号:bigsai ,回复进群加入打卡,回复bigsai分享一些学习资源! 上周第一次 LeetCode 36有效的数独&37解数独(八皇后问题) 上周第二次 LeetCode 38外观 ...

  2. 41. 缺失的第一个正数 golang

    41. 缺失的第一个正数 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3 ...

  3. LeetCode--41.缺失的第一个正数(C)

    缺失的第一个正数(C) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 申请额外空间实现 3.2 原数组实现 1. 题目描述 难度:困难 2. 题目分析 这道题本质上是很简单的,但是加上了这 ...

  4. Java实现 LeetCode 41 缺失的第一个正数

    41. 缺失的第一个正数 给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: ...

  5. Leetcode算法Java全解答--41. 缺失的第一个正数

    Leetcode算法Java全解答–41. 缺失的第一个正数 文章目录 Leetcode算法Java全解答--41. 缺失的第一个正数 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 ...

  6. 41. First Missing Positive 缺失的第一个正数

    Title 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [ ...

  7. 努力前端【LeetCode-10】448. 找到所有数组中消失的数字 442. 数组中重复的数据(中等) 41. 缺失的第一个正数(困难) [鸽笼原理,数组,Map,类似No.645]

    文章目录 题目描述-448 一.哈希Map 二.空间复杂度的优化--鸽笼原理 三.总结 题目描述-442 一.还是hashMap 二.继续鸽笼原理 题目描述-41 一.基础方案 二.数组模拟Map 题 ...

  8. Leetcode--41. 缺失的第一个正数

    给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11 ...

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

    文章目录 题目描述 思路 & 代码 题目描述 难点在于时空复杂度的要求 想出最优方法,需要认真理解题目. 思路 & 代码 做法:建立一个逻辑上的哈希表,令 nums[i] = i + ...

  10. 41,缺失的第一个正数

    解题思路 一,暴力肯定不可取,时间要O(n^2) 二,sort一遍也不行,空间要O(n) 三,时间要O(n),空间常数,只能找方法. 可以想到,如果每个数字刚好对应那个 空间地址(nums[i]==i ...

最新文章

  1. GDB 格式化结构体输出
  2. H5中使用Web Storage来存储结构化数据
  3. 关于ZipOupputStream添加压缩包常见问题
  4. 关于解决jdbc版本错误问题
  5. 从Oracle到PostgreSQL:最全控制文件
  6. js (jQuery) 之 取值
  7. linux里车目录是什么意思,linux 命令整理
  8. 解决微信浏览器不能自动播放视频
  9. EXCEL 批量插入指标批注
  10. 京东3元无门槛优惠券变京豆
  11. 技术干货丨《大天使之剑H5》主程与项目总监:H5游戏的压缩与优化经验
  12. 内蒙古计算机考研学校选择,2020内蒙古考研指南-这些没有A+的院校你会选择吗...
  13. Java 输出1-100之内的所有质数
  14. win11更新后任务栏空白电脑卡死怎么办?
  15. 重新思考 视频超分辨 Transformers 中的对齐
  16. solidity第一课—了解Remix和Hellosolidity三行代码
  17. 史上最全 Appium 自动化测试从基础到框架实战精华学习笔记(一)
  18. 第一章 初识Java总结
  19. ftp登录shell为nologin无法登录
  20. 考研经历,川大(网络空间安全)

热门文章

  1. php 回调cache 方案,基于PHP的一种Cache回调与自动触发技术
  2. ajajx请求php能设置cookie,为什么在AJAX请求返回后浏览器没有设置cookie?
  3. 【转】NodeJs使用Mysql模块实现事务处理
  4. spring cloud gateway 源码解析(4)跨域问题处理
  5. 阿里的Atlas组件化框架
  6. Android 通过Base64上传图片到服务器
  7. mysql 查询一年中每个月份的数据量
  8. VMware OSP对比VMware Tools:简化Linux驱动更新
  9. 如何对系统日志中事件 ID 9、事件 ID 11 和事件 ID 15 错误消息进行故障排除
  10. Linux学习——gcc编译C程序