题目链接:https://leetcode.cn/problems/find-all-numbers-disappeared-in-an-array/
思路如下:
含有 n n n 个整数,数组下标的大小在区间 [ 0 , n − 1 ] [0,n-1] [0,n−1] 内,数组元素的大小在区间 [ 1 , n ] [1, n] [1,n] 内,我们可以将元素映射到下标,以此来判断数字是否出现过。
假设当前元素是 x
,那么我们把第 x - 1
位置上的元素乘以 -1
,表示数字 x
出现过。
当然如果第 x - 1
位置上的元素已经是负数了,表示数字 x
已经出现过了,就不需要再把第 x - 1
位置上的元素乘以 -1
。
最后,对数组中的每个位置遍历一遍,正数的下标 i
所对应的数字 i + 1
就是未曾出现过的数字,即为答案。
C++ 代码如下:
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int n = nums.size();
for (auto x : nums) {
x = abs(x);
if (nums[x - 1] > 0) {
nums[x - 1] *= -1;
}
}
vector<int> res;
for (int i = 0; i < n; i++) {
if (nums[i] > 0) {
res.push_back(i + 1);
}
}
return res;
}
};