技术交流可以加:
本人微信:xcg852390212
本人qq:852390212
学习交流qq群1(已满): 962535112
学习交流qq群2: 780902027
LeetCode中文
LeetCode英文
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
说明:
进阶:
用unordered_map
(无序哈希表)来建立nums1
中字符和其出现个数之间的映射, 然后遍历nums2
数组,如果当前字符在哈希表中的个数大于0,则将此字符加入结果中,然后哈希表的对应值自减1。
设nums1
的大小为m
,数组nums2
的大小为n
C++代码
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> res;
unordered_map<int,int> mp;
for(auto a : nums1) ++mp[a];
for(auto b : nums2)
{
if(mp[b] > 0)
{
res.push_back(b);
--mp[b];
}
}
return res;
}
};
Python代码
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
dt = {}
res = []
for a in nums1:
if a not in dt:
dt[a] = 1
else:
dt[a] += 1
for b in nums2:
if b in dt and dt[b] > 0:
res.append(b)
dt[b] -= 1
return res
优化空间:哈希表统计两数组中长度较小的那个数组的元素个数。
C++代码
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> res;
unordered_map<int,int> mp;
if(nums1.size() > nums2.size())
{
//长度较小的数组拷贝到临时数组
vector<int> tmp(nums2);
nums2 = nums1;
nums1 = tmp;
}
for(auto a : nums1) ++mp[a];
for(auto b : nums2)
{
if(mp[b] > 0)
{
res.push_back(b);
--mp[b];
}
}
return res;
}
};
先将nums1
和nums2
排序(从小到大排序),定义两个指针p1
和p2
分别从nums1
和nums2
出发,处理情况如下:
nums1[p1] == nums2[p2]
,则将numns[p1]
放入结果,同时++p1
,++p2
;nums1[p1] < nums2[p2] ? ++p1 : ++p2
。直到p1
或p2
到达数组尾部。
设nums1
的大小为m
,数组nums2
的大小为n
C++代码
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
vector<int> res;
int p1 = 0,p2 = 0;
while(p1 < nums1.size() && p2 < nums2.size())
{
if(nums1[p1] == nums2[p2])
{
res.push_back(nums1[p1]);
++p1;
++p2;
}
else{
nums1[p1] < nums2[p2] ? ++p1 : ++p2;
}
}
return res;
}
};