> 技术文档 > LeetCode 349题解 | 两个数组的交集_双数组遍历取交集

LeetCode 349题解 | 两个数组的交集_双数组遍历取交集


两个数组的交集

  • 一、题目链接
  • 二、题目
  • 三、分析
  • 四、编写代码

一、题目链接

349.两个数组的交集

二、题目

LeetCode 349题解 | 两个数组的交集_双数组遍历取交集

三、分析

法一:
去重+查找:先对两个数组用set去重,再遍历其中一个数组看这个数组中的元素在另一个数组中出现的次数若为1,那么就push_back到vector里。

法二:
找交集可以用去重+遍历的比对算法:依次比较,小的++;相等的就是交集,同时++。其中一个结束就结束了。(这个算法思路还可以用在找差集:依次比较。小的就是差集,小的++;相等就同时++。其中一个结束就结束了,没结束的那个剩下的元素也是差集。)算法效率比法一高,只需遍历一遍,时间复杂度是O(N)。
LeetCode 349题解 | 两个数组的交集_双数组遍历取交集

四、编写代码

// 法一class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { // 去重 set<int> s1(nums1.begin(), nums1.end()); set<int> s2(nums2.begin(), nums2.end()); vector<int> v; for (auto e : s1) { // 查找 if (s2.count(e)) { v.push_back(e); } } return v; }};
// 法二class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { // 去重 set<int> s1(nums1.begin(), nums1.end()); set<int> s2(nums2.begin(), nums2.end()); auto it1 = s1.begin(), it2 = s2.begin(); vector<int> v; while (it1 != s1.end() && it2 != s2.end()) { if (*it1 < *it2) { ++it1; } else if (*it1 > *it2) { ++it2; } else { v.push_back(*it1); ++it1, ++it2; } } return v; }};