- 想到的解法是使用两个map来进行记录,mp1用来统计num1中每个元素出现的次数。
- 当nums2的元素能够在mp1中查找到时,将这个元素添加到mp2,按照这个规则统计得到nums2和nums1重复的元素,mp2中的value记录了nums2中这个元素出现的次数
- 最后我们只需要将两个map同一键值的value取最小值,并添加最小值个数个键值元素到返回数组即可
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> v;
unordered_map<int, int> mp1;
unordered_map<int, int> mp2;
for(int i = 0; i < nums1.size(); i++){
mp1[nums1[i]]++;
}
for(int j = 0; j < nums2.size(); j++){
if(mp1.find(nums2[j]) != mp1.end()){
mp2[nums2[j]]++;
}
}
for(auto pair : mp2){
int num = min(mp2[pair.first], mp1[pair.first]);
for(int i = 0; i < num; i++){
v.push_back(pair.first);
}
}
return v;
}
};
看了官方的题解,在插入到返回数组的处理更加简便,减少了for循环进行对比,在此之前没怎么用过**map.count()**这个函数。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
if (nums1.size() > nums2.size()) {
return intersect(nums2, nums1);
}
unordered_map <int, int> m;
for (int num : nums1) {
++m[num];
}
vector<int> intersection;
for (int num : nums2) {
if (m.count(num)) {
intersection.push_back(num);
--m[num];
if (m[num] == 0) {
m.erase(num);
}
}
}
return intersection;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/intersection-of-two-arrays-ii/solutions/327356/liang-ge-shu-zu-de-jiao-ji-ii-by-leetcode-solution/
来源:力扣(LeetCode)