-
链接
https://leetcode.cn/problems/find-all-numbers-disappeared-in-an-array/ -
题目
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
示例一
输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]
示例二
输入:nums = [1,1]
输出:[2]
-
思路
- 第一种,用map:
- 定义一个
map
用来记录在[1,n]
范围内哪些值存在、哪些值不存在;定义一个名为ans
的vector用来存函数返回值 - 遍历
nums
,把存在的值在map
中标为1,代表该值存在 - 遍历
map
,把不存在的点,即值为0的点存入ans
- 最后返回
ans
- 该方法思路简单,但是内存和时间消耗都很大,不推荐
- 定义一个
- 第二种,利用vector容器的各种操作:
- 定义一个大小为
nums.size()
,初始值为1-n,名为ans
的vector - 遍历
nums
,把nums
里存在的元素在ans
里标0 - 删除
ans
里值为0的元素 - 返回
ans
- 该方法要注意
ans
的初始化和删除操作
- 定义一个大小为
- 第一种,用map:
-
代码
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
//第一种
vector<int> ans;
map<int,int> mp;
for(int i = 0;i < nums.size();i++)
mp[nums[i]]=1;
for(int i = 1;i <= nums.size();i++)
if(mp[i] != 1)
ans.push_back(i);
return ans;
//第二种
vector<int> ans(nums.size());
iota(ans.begin(),ans.end(),1);
//初始化ans的值,ans内的元素的值为1到nums.size()
for(int i = 0;i < nums.size();i++)
ans[nums[i]-1]=0;
auto iter = remove(ans.begin(),ans.end(),0);
ans.erase(iter,ans.end());
return ans;
}
};