【算法】组中元素全是1~n之间的整数问题

本文探讨了长度为n的数组中,元素全在1~n范围内的一类问题,包括如何在O(n)时间复杂度内进行排序和寻找缺失的数。通用解法是通过循环替换,对于寻找缺失数的问题,还可以使用异或操作。同时介绍了LeetCode上的相关题目,如448. Find All Numbers Disappeared in an Array、442. Find All Duplicates in an Array和41. First Missing Positive,并给出了相应的解题思路和技巧。
摘要由CSDN通过智能技术生成

数组中数全是1~n的范围内的题

这部分之前是在LeetCode的好题总结里的,不过在打算给类似问题专题化之后,就单独把这部分拿了来了,然后又新加了一些总结和解法。

长度为n的数组,其中元素全部为1~n,则这种题有一个通用的解法:
循环替换 num[num[i]] = num[i]直到不能替换为止。然后再继续。具体操作上,可以不断的做swap(num[i],num[num[i]])这样写起来代码更短,更方便。

还有一种比较trick的思路就是,nums[i]的数组,将其在nums[nums[i]]这个位置坐上一些标记。

对于这类数组一个最经典的两个问题就是:

  1. 给定一个长度为n的数组,数组中元素是1~n之间的数乱序排列,将其用O(n)时间复杂度排序
  2. 给定一个长度为n-1的数组,数组中元素是1~n之间的数乱序排列,但少了一个数,让O(n)的时间内找出这个缺少的这个数。

对于第一个问题,就直接采用上面说的办法,不断轮换,就可以了。【其实难道不是直接输出从1~n不就好了吗,更方便,笑】
对于第二个问题,也是采用上面的方法,不断轮换,然后再遍历一遍,发现num[i]位置上是否是i+1如果不是则说明这个元素就是的了。其实还有一个别的解法,就是将数组中所有元素都给异或一遍,然后再跟1~n都给异或一遍,则最后剩下的那个值就是缺失的元素了。

LeetCode 上关于这种数组有以下三道题:
448. Find All Numbers Disappeared in an Array这道题是在1~n数组中全部找到其中消失的元素。
Input:
[4,3,2,7,8,2,3,1]
Output:
[5,6]

    vector<int><
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值