一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情。
一、问题描述
给你两个整数数组 nums1
和 nums2
,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
题目链接:两个数组的交集 II
二、题目要求
样例 1
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
复制代码
样例 2
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
复制代码
考察
1.暴力、哈希
2.建议用时15~30min
复制代码
三、问题分析
1.暴力法
通常来说,计算机1s可以运行 次,这一题的范围是 ,双重for循环不会超时,先来暴力搞一波。
我只需要先遍历一个数组nums素是否在nums2里面。
如果在的话,值插入第三个数组,并将nums2的值置为-1,防止重复。
2.哈希
题目中数组的每个元素不是唯一的,先用哈希表存储nums1出现的数字次数。
遍历nums2找寻数字是否在哈希表出现过,如果-1,存储数据。
四、编码实现
1.暴力法
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
int i,j,m=nums1.size(),n=nums2.size();//初始化数据
vector<int>v;
for(i=0;i<m;i++)//遍历其中一个数组
{
for(j=0;j<n;j++)
{
if(nums1[i]==nums2[j])//如果相等
{
v.push_back(nums1[i]);//插入第三个数组
nums2[j]=-1;//置为-1
break;//退出这层循环
}
}
}
return v;
}
};
复制代码
2.哈希
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
int i;//初始化数据
vector<int>v;
map<int,int>m;//哈希计数
for(i=0;i<nums1.size();i++)//遍历其中一个数组
m[nums1[i]]++;
for(i=0;i<nums2.size();i++)//判断第二个数组
{
if(m[nums2[i]]>0)//存在数据
{
v.push_back(nums2[i]);//存储
m[nums2[i]]--;//计数-1
}
}
return v;
}
};
复制代码
五、测试结果
执行用时少了一半,这叫牺牲空间换时间。