来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii
方法一:哈希表
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
if(nums1.size() > nums2.size()){
return intersect(nums2, nums1);
}
unordered_map <int,int> m;
for (int num : nums1){
++m[num];
}
vector<int> intersection;
for(int num : nums2){
if(m.count(num)){
intersection.push_back(num);
--m[num];
if(m[num] == 0){
m.erase(num);
}
}
}
return intersection;
}
};
时间复杂度:O(m+n)O(m+n)
,其中 mm 和 nn 分别是两个数组的长度。需要遍历两个数组并对哈希表进行操作,哈希表操作的时间复杂度是 O(1)O(1),因此总时间复杂度与两个数组的长度和呈线性关系。
空间复杂度:O(\min(m,n))O(min(m,n))
,其中 mm 和 nn 分别是两个数组的长度。对较短的数组进行哈希表的操作,哈希表的大小不会超过较短的数组的长度。为返回值创建一个数组 intersection,其长度为较短的数组的长度。
方法二:排序 + 双指针
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
int length1= nums1.size(), length2 = nums2.size();
vector<int> intersection;
int index1=0,index2=0;
while(index1<length1 && index2<length2){
if(nums1[index1] < nums2[index2]){
index1++;
} else if (nums1[index1] > nums2[index2]){
index2++;
} else {
intersection.push_back(nums1[index1]);
index1++;
index2++;
}
}
return intersection;
}
};
时间复杂度:O(m \log m+n \log n)O(mlogm+nlogn)
,其中 mm 和 nn 分别是两个数组的长度。对两个数组进行排序的时间复杂度是 O(m \log m+n \log n)O(mlogm+nlogn),遍历两个数组的时间复杂度是 O(m+n)O(m+n),因此总时间复杂度是 O(m \log m+n \log n)O(mlogm+nlogn)。
空间复杂度:O(\min(m,n))O(min(m,n))
,其中 mm 和 nn 分别是两个数组的长度。为返回值创建一个数组 intersection,其长度为较短的数组的长度。不过在 C++ 中,我们可以直接创建一个 vector,不需要把答案临时存放在一个额外的数组中,所以这种实现的空间复杂度为 O(1)O(1)。