Given two arrays, write a function to compute their intersection.
Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2, 2].
没有明确给出。
这道题的原始版本之前已经做过了,见LeetCode 349. Intersection of Two Array。所以我按照之前的两种思路:用关联容器跟用排序加双指针去做这道题
1.用关联容器:
与之前做的不一样的是,这道题允许元素重复出现在结果中,因此改动主要有两个地方,一是关联容器换成是unordered_multiset以便能够保持重复元素,二是通过迭代器去删除已发现的元素避免把具有相同值的元素都删掉。程序的其他细节与之前的类似,可以参考之前的博文。
2.用排序加双指针
唯一要改的地方就是去掉了加入元素时判断不重复的语句,因为题目允许元素重复,所以直接添加即可,其他代码不变。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> intersection;
unordered_multiset<int> number(nums1.begin(), nums1.end());
unordered_multiset<int>::iterator itr = number.end();
for (auto n: nums2) {
itr = number.find(n);
if (itr != number.end()) {
intersection.push_back(n);
number.erase(itr);
}
}
return intersection;
}
};
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> intersection;
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
for (int i = 0, j = 0; i < nums1.size() && j if (nums1[i] > nums2[j])
j++;
else if (nums1[i] < nums2[j])
i++;
else {
intersection.push_back(nums1[i]);
i++;
j++;
}
}
return intersection;
}
};
由于做过这道题的第一版,所以这二版挺简单的,根据题意改一下代码即可通过。
今天第一个坑,接下来是第二个坑,加油!↖(^ω^)↗