给你一个含 n
个整数的数组 nums
,其中 nums[i]
在区间 [1, n]
内。请你找出所有在 [1, n]
范围内但没有出现在 nums
中的数字,并以数组的形式返回结果。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1] 输出:[5,6]
示例 2:
输入:nums = [1,1] 输出:[2]
思路1:通过两个循环,外层是我们要查看在不在数组的数字,内层是给定的输入数组,对每一个要查看的数组定义一个标识位,然后遍历内层,如果找到了就设置标志位为真,同时将标志位加入到循环的条件判断中减少循环次数。如果为找到就将其添加进结果中。
#include <vector>
using namespace std;
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int n = nums.size();
vector<int> result;
// 遍历 1 到 n 的每个数字
for (int i = 1; i <= n; ++i) {
bool found = false;
// 在 nums 中查找 i 是否存在
for (int j = 0; j < nums.size() && !found; ++j) {
if (i == nums[j]) {
found = true;
}
}
// 如果没有找到 i,则将其添加到结果中
if (!found) {
result.push_back(i);
}
}
return result;
}
};
这种方法的时间复杂度是 O(n^2),这是因为对于每个数字 i
,我们都可能需要遍历整个数组 nums
。超时了,所有考虑用空间换取时间。
思路2: 我们可以初始化一个长度为输入的数组result其初始值全为0,遍历给定数组,将给定数组中的值都加上一个固定的长度 再写入result中正确的对应位置。 如 [4,3,2,7,8,2,3,1],第一个数为4,我们获取的下标索引因该是 index=nums[0]-1;然后再将该位置的值加上固定值。 最后再创建一个最终的返回结果,遍历result对于长度小于固定值的位置+1返回。
#include <vector>
using namespace std;
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> result(nums.size(), 0);
vector<int> missingNumbers;
for (int i = 0; i < nums.size(); ++i) {
int index = nums[i] - 1;
result[index] += nums.size();
}
for (int i = 0; i < result.size(); ++i) {
if (result[i] < nums.size()) {
missingNumbers.push_back(i + 1);
}
}
return missingNumbers;
}
};
这样就可以通过咯!