这两个题的解题思路很像
Leecode-448找到所有数组中消失的数字:
给你一个含 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
解决代码如下,核心利用哈希思想:
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int n=nums.size();
vector<int> syn(n+1,0);
for(int i=0;i<n;i++){
syn[nums[i]]=1;
}
vector<int> ans;
for(int i=1;i<n+1;i++){
if(syn[i]==0){
ans.push_back(i);
}
}
return ans;
}
};
int main(){
Solution t;
vector<int> nums{1,1};
vector<int> ans=t.findDisappearedNumbers(nums);
for(int i=0;i<ans.size();i++){
cout<<ans[i]<<endl;
}
return 0;
}
Leecode-442数组中重复的数据:
给你一个长度为 n
的整数数组 nums
,其中 nums
的所有整数都在范围 [1, n]
内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n)
且仅使用常量额外空间的算法解决此问题。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1] 输出:[2,3]
示例 2:
输入:nums = [1,1,2] 输出:[1]
示例 3:
输入:nums = [1] 输出:[]
提示:
n == nums.length
1 <= n <= 105
1 <= nums[i] <= n
nums
中的每个元素出现 一次 或 两次
ac代码:
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
int n=nums.size();
vector<int> syn(n+1,0);
for(int i=0;i<n;i++){
syn[nums[i]]++;
}
vector<int> ans;
for(int i=1;i<n+1;i++){
if(syn[i]==2){
ans.push_back(i);
}
}
return ans;
}
};