题目:
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。
进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii
思路:
1、首先拿到两个数组去重后的交集
2、对去重后的交集,复制n份,n等于其在2个数组中出现的最小次数
Python代码:
class Solution(object):
def intersect(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
ls = set(nums1) & set(nums2)
ret = []
for item in ls:
for i in range(min(nums1.count(item), nums2.count(item))):
ret.append(item)
return ret
C++代码:
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
set<int> set1{nums1.begin(), nums1.end()};
set<int> set2{nums2.begin(), nums2.end()};
set<int> ls;
for (int item:set1){
if(find(set2.begin(), set2.end(), item)!=set2.end()){
ls.insert(item);
}
}
vector<int> ret;
for (int item:ls){
int item_num1 = count(nums1.begin(),nums1.end(),item);
int item_num2 = count(nums2.begin(),nums2.end(),item);
int count = min(item_num1, item_num2);
for (int i=0; i<count; i++){
ret.push_back(item);
}
}
return ret;
}
};
思路2:
1、对于排序后的数组采用滑动窗口的做法
Python代码:
class Solution(object):
def intersect(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
nums1.sort()
nums2.sort()
l1, l2 = 0, 0
ret = []
while l1<len(nums1) and l2<len(nums2):
if nums1[l1]==nums2[l2]:
ret.append(nums1[l1])
l1 += 1
l2 += 1
elif nums1[l1] > nums2[l2]:
l2 += 1
else:
l1 += 1
return ret
C++代码:
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
int l1=0;
int l2=0;
vector<int> ret;
while (l1<nums1.size() && l2<nums2.size()){
if(nums1[l1]==nums2[l2]){
ret.push_back(nums1[l1]);
l1 += 1;
l2 += 1;
}else if (nums1[l1]>nums2[l2]){
l2 += 1;
}else{
l1 += 1;
}
}
return ret;
}
};
网友评论