classSolution { public: vector<int> intersection(const vector<vector<int>>& nums){ int n = nums.size(); unordered_map<int, int> freq; for (constauto& arr: nums) { for (int num: arr) { ++freq[num]; } } vector<int> res; for (constauto& [k, v]: freq) { if (v == n) { res.push_back(k); } } return res; } };
2. 模拟方式
二维数组相当于有 N 个一维数组,先使用一个哈希表 res 存储第一个数组 nums[0] 的所有元素。然后循环遍历其余的数组。当遍历第 i 个数组时,我们用一个哈希表 tmp 来存储 res 和 nums[i] 中元素的交集,也就是说我们通过遍历 nums[i] 判断每个元素是否在 res 中,最后,我们让 res = tmp。这样就可以得到前 i+1 个数组的交集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public: vector<int> intersection(vector<vector<int>>& nums){ int n = nums.size(); unordered_set<int> res(nums[0].begin(), nums[0].end()); for (int i = 1; i < n; ++i) { unordered_set<int> tmp; for (int num: nums[i]) { if (res.count(num)) { tmp.insert(num); } } res = tmp; } vector<int> ans(res.begin(), res.end()); sort(ans.begin(), ans.end()); return ans; } };
二、多个有序数组求交集
有多个有序数组。求这些数组中的交集。我们列出多种方法。
1. 二分查找+多路归并
先使用第一个数组作为基准,也就是说,用第一个数组中的元素作为基准。拿到第一个数组的长度为 N,然后外层循环是从 0 到 N,也就是遍历第一个数组中的元素。假设一共有 M 个数组,内层循环是遍历剩下的所有数组,也就是从 1 到 M,第一个数组不用再遍历。