题目链接:点击查看
题目描述:
给定一个长度为
n
的数组,其中包含范围为
1
到
n
的整数,有些整数重复了多次,有些整数没有出现,求 1
到
n
中没有出现过的整数。
输入输出:
输入: [4,3,2,7,8,2,3,1] 输出: [5,6]
题目分析:
利用数组这种数据结构建立
n 个桶,用来对于已经出现过的元素进行标记。例如当前元素是 nums[i],那么我们把第 nums[i] - 1位置的元素 乘以 -1,表示这个该位置出现过。当然,如果 第 nums[i] - 1位置的元素已经是负数了,表示 nums[i] 已经出现过了,就不用再把第 nums[i] - 1位置的元素乘以 -1。最后,对数组中的每个位置遍历一遍,如果 i 位置的数字是正数,说明 i 未出现过。详见如下代码。
代码:
vector<int> findDisappearedNumbers(vector<int>&nums)
{
vector<int>ans;
for(const int &num:nums)
{
int pos=abs(num)-1;
if(nums[pos]>0)
{
nums[pos]=-nums[pos];
}
}
for(int i=0;i<nums.size();++i)
{
if(nums[i]>0)
{
ans.push_back(i+1);
}
}
return ans;
}