给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 10000 <= nums1[i], nums2[i] <= 1000
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {//undered_set是c++中的一种关联容器,会自动去重,他存储的元素是唯一的,并且在查找元素时具有平均常数时间复杂度//定义无序集合,定义两个unordered_set<int>类型变量set1和set2;unordered_set<int> set1, set2;//auto&表示自动推导变量类型并使用引用,避免不必要的拷贝//遍历nums1中的每个元素num并将其插入到set1for (auto& num : nums1) //insert用于插入元素set1.insert(num);for (auto& num : nums2) set2.insert(num);//getIntersection通过遍历一个合集在另一个合集中寻找元素return getIntersection(set1, set2);}vector<int> getIntersection(unordered_set<int>& set1, unordered_set<int>& set2) {if (set1.size() > set2.size()) return getIntersection(set2, set1);vector<int> intersection; for (auto& num : set1) {//count用于统计每个元素出现的次数if (set2.count(num))//puck_back用于在容器末尾添加元素 intersection.push_back(num);}return intersection;}
};
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {//sort对元素进行排序sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());int length1 = nums1.size(), length2 = nums2.size();int index1 = 0, index2 = 0;//定义储存交集的向量 定义一个名为intersection的vector<int>类型的变量用于储存nums1和nums2的交集vector<int> intersection;while (index1 < length1 && index2 < length2) {int num1 = nums1[index1], num2 = nums2[index2];if (num1 == num2) {//back用于最后一个元素的引用
// 保证加入元素的唯一性,判断intersection.size()是否为空,判断当前找到的交集原宿nums1是否与intersection向量中最后一个元素不相等if (!intersection.size() || num1 != intersection.back())//puck_back用于向容器末尾添加元素intersection.push_back(num1);index1++;index2++;}else if (num1 < num2) index1++;else index2++;}return intersection;}
};
