题目描述和分析
本博客所介绍的两道题,都是返回两个数组的交,区别在于lc349lc349lc349要求返回的结果内元素独一无二。举一个简单的测试案例,Input:a1=1,2,2,3a2=2,2Input: a1=1,2,2,3 \quad a2=2,2 Input:a1=1,2,2,3a2=2,2 output:lc349(a1,a2)=2lc350(a1,a2)=2,2output: lc349(a1, a2)=2 \quad lc350(a1,a2)=2,2output:lc349(a1,a2)=2lc350(a1,a2)=2,2 虽然这两道题非常相似,但是求解的思路却截然不同。lc349lc349lc349既然只需要保证返回的元素在两个输入数组中都存在过,只需要遍历输入数组的元素,依次判断是否存在于另一数组中。lc350lc350lc350中相同元素相交的个数比较麻烦,这里,作者考虑一种稳妥的做法,先对输入数组升序排序,这样在遍历的过程中不用刻意考虑相交次数这一辣手问题。
代码
lc349lc349lc349
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> inte;
for (unsigned i = 0; i < nums1.size(); i++) {
if (find(nums2.begin(), nums2.end(), nums1.at(i)) != nums2.end()) {
if (find(inte.begin(), inte.end(), nums1.at(i)) == inte.end()) {
inte.push_back(nums1.at(i));
}
}
}
return inte;
}
需要注意的是,在遍历过程中,会出现相同的元素,需要增加额外的判断语句。这一解答在LeetCode上实测为12ms,时间复杂度为N(a1.size)N(a1.size)N(a1.size),当然可以每次遍历较短的数组来优化代码,具体的就不演示了。
lc350lc350lc350
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> inte;
// sort two vectors
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
unsigned i = 0, j = 0;
while (i < nums1.size() && j < nums2.size()) {
if (nums1.at(i) == nums2.at(j)) {
inte.push_back(nums1.at(i));
i ++;
j ++;
} else {
if (nums1.at(i) > nums2.at(j))
j ++;
else
i ++;
}
}
return inte;
}
这种解法在LeetCode上实测得到8ms,已经到达top了。有的朋友希望通过不排序来做,个人认为需要用到字典来储存已匹配到的相交元素在输入数组中的index。