网站建设主要工作由哪些sns营销
原题链接
难度:easy\color{Green}{easy}easy
题目描述
给你两个整数数组 nums1nums1nums1 和 nums2nums2nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
提示:
- 1<=nums1.length,nums2.length<=10001 <= nums1.length, nums2.length <= 10001<=nums1.length,nums2.length<=1000
- 0<=nums1[i],nums2[i]<=10000 <= nums1[i], nums2[i] <= 10000<=nums1[i],nums2[i]<=1000
** 进阶 :**
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1nums1nums1 的大小比 nums2nums2nums2 小,哪种方法更优?
- 如果 nums2nums2nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
算法
(排序双指针) O(n+m)O(n+m)O(n+m)
- 排序。
- 双指针遍历两个数组,如果 ·
nums1
小,1的下标右移,nums2
小2右移。 - 如果相等,加入目标数组,直到退出循环。
复杂度分析
-
时间复杂度:O(m+n)O(m + n)O(m+n)。
-
空间复杂度 : O(min(m+n))O(min(m + n))O(min(m+n))
C++ 代码
class Solution {
public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());vector<int> res;int left = 0, right = 0;while (left < nums1.size() && right < nums2.size()) {if (nums1[left] < nums2[right])left ++;else if (nums1[left] == nums2[right]) {res.push_back(nums1[left]);left ++, right ++;} else {right ++;}}return res; }
};
算法2
(集合)
- 使用数据结构
unordered_multiset
存储nums1
中的每个元素。 - 遍历数组
nums2
,如果在 集合中,把该值加入答案,并且在集合中删除该值。
复杂度分析
- 时间复杂度:O(n)O(n)O(n)。
C++ 代码
class Solution {
public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {unordered_multiset<int> S;vector<int> res;for (int x : nums1) S.insert(x);for (int x : nums2)if (S.count(x)){res.push_back(x);S.erase(S.find(x));}return res;}
};