简单
给你一个含 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]
提示:
n == nums.length
1 <= n <= 105
1 <= nums[i] <= n
**进阶:**你能在不使用额外空间且时间复杂度为 O(n)
的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。
题解1: 将sums数组中出现的元素记录为1,未出现的元素记录为0,将记录为0的元素返回
具体操作为
使用一个大小为n的数组Temp
将nums[i]-1
作为Temp
数组的下标记录为1(Temp数组的初始值为0),最后将Temp[i]
为0的下标+1
压入Temp2[i]
以记录结果,最后返回
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int n=nums.size();
vector<int>Temp(n,0);//大小为n初始值为0的Temp
for(int i=0;i<n;i++)
Temp[nums[i]-1]=1;//出现的值记录为1
vector<int>Temp2;//获取目标值用于返回
for(int i=0;i<n;i++)
if(Temp[i]==0)
Temp2.push_back(i+1);//由于记录时将i-1作为下标,获取目标值时加回来
return Temp2;
}
};
题解2: 将出现的值-1作为下标置负,由于出现的值可能之前被直负因此需要取绝对值nums[abs(nums[i])-1]=-abs(nums[abs(nums[i])-1])
如果一个下标为i
的值为正数则代表值i+1
不存在将i+1
压入Temp
即可
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int n=nums.size();
for(int i=0;i<n;i++)
nums[abs(nums[i])-1]=-abs(nums[abs(nums[i])-1]);//置负
vector<int>Temp;
for(int i=0;i<n;i++)
if(nums[i]>0)
Temp.push_back(i+1);
return Temp;
}
};