原代码
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> res;
unordered_set<int> num_set(nums1.begin(),nums1.end());
for(int num : nums2)
{
if(num_set.find(num)!=num_set.end())
{
res.insert(num);
}
}
return vector<int>(res.begin(),res.end());
}
};
语言是C++,时间复杂度为O(n),空间复杂度为O(1)
代码详解
vector<int>
这句代码的意思为定义一个int类型的容器。
通俗来讲就是一个长度可以改变的int数组,加以区分叫容器。
vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
这是函数的定义,表明返回值为一个int类型的容器;函数名为intersection;有两个参数,两参数都是容器的地址,这两个容器存放需要操作的两个数组。(这里num1 和 num2就可以理解为指向两个容器首地址的指针)
unordered_set<int> res;
unordered_set<int> num_set(nums1.begin(),nums1.end());
unordered_set :这是c++自带的数据结构,并不知道准确的中文名字哈哈哈,但是可以简单描述一下,可以直译为无序容器有点类似于vector,但是有区别,第一unordered_set底层是哈希表实现的,是一个无需表,且数组元素不能重复,自带的查询方法 删除方法的效率为O(1)1
unordered_set num_set(nums1.begin(),nums1.end());
这里将vector容器转换为unordered_set容器。但是要注意的是,nums1.begin()这个函数返回的是一个指针,指向第一个元素;nums1.end()返回的是一个指针 指向的是最后一个元素的后一个空间,这里要注意,不然后面的判断语句会读不明白。我学习到这也卡了一会。
for(int num : nums2)
循环语句,每次循环将nums2里的元素取一个出来赋值给num;
有点像python里的for x in y:
这是个语法知道就行
if(num_set.find(num)!=num_set.end())
{
res.insert(num);
}
num_set.find(num):在num_set容器中寻找num,如果找到返回对应元素的指针,找不到返回的指针于num_set.end()返回的指针一样。这我在上面提到了,要理解end()方法的返回值。
res.insert(num):如果找到相同的值,插入到res容器中,但是注意,res是unordered_set类型的容器,里面的数值不会重复,这是函数方法自身会解决的不用我们自己来搞。
return vector<int>(res.begin(),res.end());
最后就是函数返回,根据返回类型重新构建一下返回值。