https://leetcode.com/problems/intersection-of-two-arrays/
Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, return [2]
.
Note:
- Each element in the result must be unique.
- The result can be in any order.
1、先排序,再用两指针分别扫描两数组(12ms)
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> num;
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
int i = 0,j = 0;
while(i<nums1.size() && j < nums2.size()){
if(nums1[i] == nums2[j] && find(num.begin(),num.end(),nums1[i]) == num.end()){
num.push_back(nums1[i]);
i++;
j++;
continue;
}
if(nums1[i]<nums2[j])
i++;
else
j++;
}
return num;
}
};
2、发现STL中有set_intersection()函数,是对于排好序后的两个集合(即不会有重复元素)求交集,因此这里调用该函数的话,会有重复元素出现。
2.1利用unique、erase去重:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
vector<int> num(100000); // 数组长度影响:100000——28ms,500——12ms
auto iter = set_intersection(nums1.begin(),nums1.end(),nums2.begin(),nums2.end(),num.begin());
num.resize(iter-num.begin());
vector<int>::iterator iter1 = unique(num.begin(),num.end());
num.erase(iter1,num.end());
return num;
}
};
2.2直接遍历去重:
class Solution {public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
vector<int> num(1000),result;// 同上,数组长度影响:100000——28ms,(500、1000等)——12ms
auto iter = set_intersection(nums1.begin(),nums1.end(),nums2.begin(),nums2.end(),num.begin());
num.resize(iter-num.begin());
int len = num.size();
for(int i = 0;i<len;i++){
if(! result.empty() && num[i]==result.back())
continue;
result.push_back(num[i]);
}
return result;
}
};