数组中数全是1~n的范围内的题
这部分之前是在LeetCode的好题总结里的,不过在打算给类似问题专题化之后,就单独把这部分拿了来了,然后又新加了一些总结和解法。
长度为n的数组,其中元素全部为1~n,则这种题有一个通用的解法:
循环替换 num[num[i]] = num[i]
直到不能替换为止。然后再继续。具体操作上,可以不断的做swap(num[i],num[num[i]])
这样写起来代码更短,更方便。
还有一种比较trick的思路就是,nums[i]的数组,将其在nums[nums[i]]这个位置坐上一些标记。
对于这类数组一个最经典的两个问题就是:
- 给定一个长度为n的数组,数组中元素是1~n之间的数乱序排列,将其用O(n)时间复杂度排序
- 给定一个长度为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><