349. Intersection of Two Arrays
Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2].
Note:
1. Each element in the result must be unique.
2. The result can be in any order.
解题思路:
想到两种思路,一种是先去重,再逐个比较;另一种是用map统计元素。第一种实现思路简单,但是效率上肯定不如第二种,先实现第一种,第二种具体实现还不是太熟悉。
C++:
version_1:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());//unique是对容器相邻元素去重,所以必须先排序
vector<int>::iterator iter1 = unique(nums1.begin(), nums1.end());
nums1.erase(iter1, nums1.end());
vector<int>::iterator iter2 = unique(nums2.begin(), nums2.end());
nums2.erase(iter2, nums2.end());
vector<int> sub;
for (int i=0; i<nums1.size(); i++)
{
for (int j=0; j<nums2.size(); j++)
{
if (nums1[i]==nums2[j])
{
sub.push_back(nums1[i]);
break;
}
}
}
return sub;
}
};
效率果然不高,耗时46ms。
version_2: map统计
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> map;
vector<int> result;
for (int i=0; i<nums1.size(); i++)
{
map[nums1[i]]++;
}
for (int i=0; i<nums2.size(); i++)
{
if (map[nums2[i]]>0)
{
result.push_back(nums2[i]);
map[nums2[i]] = 0; //为了避免出现重复元素
}
}
return result;
}
};
Top Solution:
耗时8ms!比第一种方法快了五六倍!多学习:
version_3:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> m(nums1.begin(), nums1.end());
vector<int> res;
for (auto a : nums2)
if (m.count(a)) {
res.push_back(a);
m.erase(a);
}
return res;
}
};
另外,version_4:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
set<int> s(nums1.begin(), nums1.end());
vector<int> out;
for (int x : nums2)
if (s.erase(x))
out.push_back(x);
return out;
}
这两种方法暂时不太理解,稍后再仔细看看。
本文介绍了一种计算两个数组交集的方法,通过不同版本的代码实现对比,展示了使用map进行元素统计的优势,最终实现了高效求解。代码示例包括C++实现,并提供了多种优化方案。
706

被折叠的 条评论
为什么被折叠?



