前置知识
查找表是一种存储结构,专门用来存储无逻辑关系的数据。也就是说,查找表就是一个包含众多元素的集合,表中的各个元素独立存在,之间没有任何关系。通过查找表,我们可以更为快速地去查询数据。
在数据结构中,将存储无逻辑关系数据的线性表、树或者图结构统称为查找表。
例题
350. 两个数组的交集 II
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
:::info
示例 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 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办
思路
为两个数组分别建立 map,统计每个数字出现的数量。
然后对其中一个 map 进行遍历,查看这个数字在两个数组中分别出现的数量,取出现的最小的那个数量,push 到结果数组中即可。var intersect = function(nums1, nums2) {const map1 = new Map();const map2 = new Map();for (let item of nums1) {map1.set(item, (map1.get(item) || 0) + 1)}for (let item of nums2) {map2.set(item, (map2.get(item) || 0) + 1);}const res = [];for (let key of map1.keys()) {const count1 = map1.get(key);const count2 = map2.get(key);if (count2) {const pushCount = Math.min(count1, count2);for (let i = 0; i < pushCount; i++) {res.push(key);}}}return res;};
进阶
当数组已经排好序时,我们可以采用 双指针 的方法解决。
- 当 nums2 容量过大时,我们可以优先遍历容量大的数组,提前结束循环。
