每日一解 两个数组的交集 II

题目 两个数组的交集 II

给定两个数组,编写一个函数来计算它们的交集。

示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

说明:

输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。

进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii

思路

思路其实还算明确,使用哈希表也就是unordered_map对其中一个数组内部的数字进行存储和计数,然后遍历另一个数组查找即可。代码实现中有个值得注意的地方,就是当两个数组长度一致的时候,如果出现相同的数字,这时谁先做哈希表会有一定的影响。
解决方法就是查找另一个数组的时候,查到一个就让哈希表中该数字的计数-1,计数为零就不往答案里添加数字了。

代码实现

class Solution {
    
    
public:
	vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
    
    
		unordered_map<int, int> data;
		vector<int> short_num, long_num;
		if (nums1.size() < nums2.size()) {
    
    
			short_num = nums1;
			long_num = nums2;
		}
		else {
    
    
			short_num = nums2;
			long_num = nums1;
		}
		for (int i = 0; i < short_num.size(); i++) {
    
    
			if (data.find(short_num[i]) == data.end()) {
    
    
				data.insert(pair<int, int>(short_num[i], 1));
			}
			else {
    
    
				data[short_num[i]] += 1;
			}
		}
		short_num.clear();
		for (int i = 0; i < long_num.size(); i++) {
    
    
			if (data.find(long_num[i]) != data.end() && data[long_num[i]] > 0) {
    
    
				short_num.push_back(long_num[i]);
				data[long_num[i]]--;
			}
		}
		return short_num;
	}
};

猜你喜欢

转载自blog.csdn.net/new_DYX/article/details/107619142