1.题目

【LeetCode448】找到所有数组中消失的数字_数组

2.思路

一定要审题——第一句话:数组元素的值在1~n范围内,并且n为数组的大小,就是说“没出现”的元素虽然不在,但是数组是开够空间给他们。

题目要求不能使用额外空间(用来存结果的ans数组除外)。
若能使用额外空间,那就是常规的使用哈希表。
而现在为了不光明正大使用哈希表,就让nums数组“成为哈希表”,以每个数组元素为下标的数组元素增加n,而再次遍历nums数组时,如果​​nums[i]​​​没大于n,则肯定没有遇到​​i+1​​(存入ans数组中)。

PS:注意加1减1的边界问题。

3.代码

class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int n=nums.size();
vector<int>ans;
for(int i=0;i<n;i++){
int k=(nums[i]-1)%n;
nums[k]+=n;
}
for(int i=0;i<n;i++){
if(nums[i]<=n){
ans.push_back(i+1);
}
}
return ans;
}
};