给定两个数组 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] 也是可通过的
来源:LeetCode
思路:要求两数组的交集,首先想到的是先把数组内部去重,再循环对比,选择均含有的元素。这里采用集合这一数据结构。 C++class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//对nums1去重
std::unordered_set<int> aset(nums1.begin(), nums1.end());
vector<int> ans;
//删除nums2中与nums1重复的元素,添加到结果数组中
for(auto& i:nums2){
if(aset.find(i)!=aset.end()){
aset.erease(i);
ans.emplace_back(i);
}
}
return ans;
}
};
这个是写这篇博客的时候偶然想到的解法,原来的想法是只设置一个集合,不对此集合进行删减,而是用额外的集合进行增加。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> ans;
unordered_set<int> aset(nums1.begin(), nums1.end());
for(auto& i:nums2){
if(aset.find(i)!=aset.end()){
ans.insert(i);
}
}
return vector<int>(ans.begin(),ans.end());
}
};
Java
为啥不像刚刚那样只用一个集合?因为用vector也得转换,用数组更是麻烦。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Intger> aset=new HashSet<>();
Set<Intger> ans=new HashSet<>();
for(int i:nums1){
aset.add(i);
}
for(int i:nums2){
if(aset.contains(i)){
ans.add(i);
}
}
//set转化成数组
int index=0;
int[] ansl=new int[ans.size()];
for(int i:ans){
ansl[index++]=i;
}
return ansl;
}
}
Python
最爽的还是Python一行流,直接集合取交集,再转化为数组,嘻嘻。
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list(set(nums1)&set(nums2))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)