First Missing Positive

原题链接First Missing Positive

给定一个序列,找到第一个没有出现的正整数,要求复杂度是O(n),空间复杂度为O(1)。
这种时间复杂度要求是O(n)的问题一般都是遍历一遍出结果,但是遍历一遍的代价是需要使用额外的空间记录某些信息以达到解决问题的目的,但是这里不可以使用额外的空间。既然不可以,但又非要不可,那么只能用源序列作为记录的空间。
也就是,在遍历的过程中修改原序列。


对于数组(vector)而言,有什么方法可以记录数值大小这种信息呢?下标。
对于某个大于0的元素n,只需要将它放在下标为n-1的位置(考虑到可能越界,所以放到n-1),那么当下次遍历到第n-1的位置时,直接判断nums[n-1]和n是否相等,就可以得知在源序列中是否出现过n这个数值。
但是有一点,假设数值n当前的下标为i,那么需要把数值n放到下标为n-1的位置,也就是和nums[n-1]交换位置。此时,数值n已经被放到了下标n-1的位置,位置关系为nums[n-1] == n,nums[i] = m(m是以前在n-1位置的数值)。接着,因为也需要给m找对应的位置,所以仍然从i开始,此时应该和nums[m-1]交换,就这么一直进行下去。最后,重新遍历一遍序列,第一个不满足nums[n] == n + 1的位置所代表的数值就是缺少的值。

代码如下

class Solution {
public:int firstMissingPositive(vector<int>& nums) {/* 对每个位置上的大于0的数值都找到对应的位置 */for(int i = 0; i < nums.size(); ++i){/* 如果不满足n == nums[n - 1],就说明n这个数值没有放到应该放的位置 *//* 这里要防止越界,通常这种情况说明数组个数比较少,但是元素大小比较大,缺少较小的那些数值 */while(nums[i] > 0 && nums[i] - 1 < nums.size() && nums[i] != nums[nums[i] - 1])swap(nums[i], nums[nums[i] - 1]);}/* 找到第一个不符合位置关系的数值 */for(int i = 0; i < nums.size(); ++i){if(nums[i] != i + 1)return i + 1;}/* 如果都满足,那么返回下一个数值 */return nums.size() + 1;}
};

这题主要利用了用下标表示数值的方法,同时利用原数组避免内存开销,这两点都是需要注意的地方。

每天一道LeetCode-----找到序列中第一个没有出现的正整数,要求时间复杂度是O(n),空间复杂度是O(1)相关推荐

  1. LeetCode 1819. 序列中不同最大公约数的数目

    文章目录 1. 题目 2. 解题 1. 题目 给你一个由正整数组成的数组 nums . 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数. 例如,序列 [4,6,16] 的最大公约数 ...

  2. 每日一道Leetcode -网格矩阵中的路径相关系列【动态规划|路径中(不)含值|有无障碍物|最小路径和】

    class Solution:def uniquePaths(self, m: int, n: int) -> int:"""排列组合方法:从左上角到右下角的过程中 ...

  3. matlab 找到数组中第一个不连续点_1.基础知识(1) Matlab基础知识

    前言: 前两次文章有读者私信说Matlab初学,基础较差,本次分享一下Matlab的基础内容,熟练者可以跳过本文,后续的文章也会在文后加上一些基础内容分享. 关键字:Matlab.数组.函数.计算.绘 ...

  4. leetcode练习--字符串中第一个唯一字符

    查找字符串中第一个唯一的字符,返回其index: 这里我用了hash的方法,没遇到一个新的字符就会将其保存至map中,我以为map里面会按照insert的顺序进行排放,结果map保存成功后输出结果如下 ...

  5. iOS LeetCode ☞ 找到字符串中所有字母异位词

    给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引.不考虑答案输出的顺序. 异位词 指由相同字母重排列形成的字符串(包括相同的字符串). 示例 1: 输入: ...

  6. 每天一道LeetCode-----在给定序列中找到满足nums[i]nums[i-1]nums[i]nums[i+1]的位置,要求时间复杂度是O(logN)

    Find Peak Element 原题链接Find Peak Element 给定一个序列,找到一个位置i满足nums[i]>nums[i−1]&&nums[i]>num ...

  7. 每天一道LeetCode-----给定序列中2/3/4个元素的和为target的所有集合,或3个元素的和最接近target的集合

    原题链接 2Sum Two Sum 意思是给定一个数组,求数组中哪两个元素的和是给定值. 蛮力法的求解就是两层for循环,时间复杂度是O(n2). class Solution { public:ve ...

  8. 每天一道LeetCode-----删除序列中指定元素,将满足要求的元素移动到前面

    Move Zeroes 原题链接Move Zeroes 意思是给定一个数组,将所有的0都移到后面,不能改变非0元素的相对顺序 把非0元素移到前面,后面补零即可,比较简单 class Solution ...

  9. Python实战从入门到精通第五讲——数据结构与算法3之序列中出现最多的元素

    怎么找到序列中出现次数最多的元素呢? collections.Counter类就是专门为这类问题设计,甚至有一个most_common直接给出答案 假设一个数字列表想找出哪个数字出现频率高 words ...

最新文章

  1. AWS S3宕机的启发: 云必须分散化
  2. docker kubernetes--
  3. easyui 修改单元格内容_初学Excel办公软件快速修改文字的方法
  4. mysql数据库是以表为单位存储的,创建一个以数据库名称为参数的MySQL存储过程,以列出具有特定数据库中详细信息的表。...
  5. 《htmlxhtml权威指南》部分标签语义学习
  6. C#-WinForm-ListView-表格式展示数据、如何将数据库中的数据展示到ListView中、如何对选中的项进行修改...
  7. 10.27大视野月赛翻车实况
  8. 好用的5款火狐浏览器必备插件,每一款都很实用
  9. python编程一球从100米_Python求解一个球从100米高度自由落下的问题
  10. 关于MSP430f149Ti官方例子-UART01
  11. vLive虚拟直播,助力企业打造线上云年会
  12. OpenMV颜色阈值设置
  13. 10款大数据处理编程语言
  14. [Python报错]CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired
  15. 在前端中清除IE浏览器缓存问题
  16. java书籍 李清华_201772020113 李清華《面向對象程序設計(java)》第18周學習總結...
  17. 2021FME博客大赛 —— 面向海量地貌数据的FME在线质检研究
  18. 一站式SCI投稿大全(感谢pennhmp116版主的整理)
  19. Python 编写 掘金3量化交易软件的常见指标实现。均线,macd,kdj,RSI,LWR。
  20. java sql数字溢出_nested exception is java.sql.SQLException: 数字溢出的问题解决

热门文章

  1. 南京信息工程大学c语言真题,南京信息工程大学C语言试题库.doc
  2. Java黑皮书课后题第8章:8.29(相同的数组)如果两个二维数组m1和m2具有相同的内容,则它们是相同的。编写一个方法,如果m1和m2相同的话,返回true
  3. Java黑皮书课后题第4章:*4.8(给出ASCII码对应的字符)编写程序,得到一个ASCII码的输入(0~27之间的一个整数),然后显示该字符
  4. 索尔维会议记录软件测试,索尔维会议
  5. 改变 input[type=range] css样式
  6. 随机变量的分布函数-定义域问题
  7. osgEarth使用没有DX的Triton库Triton-MT-DLL-NODX.lib
  8. Xtrabackup 安装使用
  9. Windows Phone开发之路(9) Silverlight之动画
  10. struts2下拉框在不同情况下的各种用法