每日一题(LeetCode)----哈希表–两个数组的交集
1.题目([349. 两个数组的交集](https://leetcode.cn/problems/valid-anagram/))
-
给定两个数组
nums1
和nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
2.解题思路
思路一:哈希表
1.创建一个哈希表,这个哈希表中的每个元素的键值表示在数组中出现的元素,实值表示在几个数组中出现过(例如,实值为1表示只在一个数组出现过,实值为2表示在两个数组中都出现了
2.遍历第一个数组,如果遍历到的元素没有在哈希表中出现,我们把当前元素作为键值,然后实值存入1
3.遍历第二个数组,如果遍历到的元素在哈希表中出现过,且出现过的元素在哈希表中对应的实值为1,那么我们更新实值为2
4.创建一个数组(这里是动态数组)来存两个数组的交集,遍历一遍哈希表,把哈希表中实值为2的元素存入到数组中,然后返回这个数组即可
思路二:排序+双指针
1.先将两个数组进行升序排序
2.创建一个结果数组(这里用的是动态数组),用来存这两个数组交集
用两个指针遍历两个数组
如果遍历到的元素相等,那么看当前元素与结果数组的尾元素是否相等,如果不相等就放到我们的结果数组中,两个指针同时向后移动一个元素
如果不相等,那么指向较小元素的指针向后移动一个元素
当其中至少有一个数组遍历完成时,结束遍历
3.写出代码
思路一的代码
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> res;unordered_map<int,int> ma;int length1 = nums1.size();int length2 = nums2.size();for(int i=0;i<length1;i++){if(ma.count(nums1[i])==0){ma[nums1[i]]=1;}}for(int i=0;i<length2;i++){if(ma.count(nums2[i])==1){ma[nums2[i]]=2;}}for(pair<int,int> v:ma){if(v.second==2){res.push_back(v.first);}}return res;}
};
思路二的代码
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> res;sort(nums1.begin(),nums1.end());sort(nums2.begin(),nums2.end());int length1=nums1.size();int length2=nums2.size();int index1=0;int index2=0;while(index1<length1&&index2<length2){int num1 = nums1[index1], num2 = nums2[index2];if (num1 == num2) {if (!res.size() || num1 != res.back()) {res.push_back(num1);}index1++;index2++;} else if (num1 < num2) {index1++;} else {index2++;}}return res;}
};