给定两个数组,编写一个函数来计算它们的交集。
示例 1:
示例 2:
1 2
| 输入:nums1 = , nums2 = 输出:
|
说明:
- 输出结果中的每个元素一定是唯一的。
- 我们可以不考虑输出结果的顺序。
思路
使用集合
c++中集合有基于红黑树的set
还有哈希的unordered_set
,使用集合可以去除重复。
将nums1
放入哈希表s1
中,遍历nums2
,若元素在s1
中,加入结果集合ans
中,最后将其转化为vector
。、
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { unordered_set<int> s1(nums1.begin(), nums1.end()); unordered_set<int> ans; for(auto num:nums2) { if(s1.find(num) != s1.end()) { ans.insert(num); } } vector<int> res(ans.begin(), ans.end()); return res; } };
|
排序,双指针
排序之后利用双指针,注意加入时去重复。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { sort(nums1.begin(), nums1.end()); sort(nums2.begin(), nums2.end()); vector<int> res; int i = 0, j = 0, n1 = nums1.size(), n2 = nums2.size(); while(i < n1 && j < n2) { if(nums1[i]==nums2[j] && (res.size()==0 || res.back() != nums1[i])) { res.push_back(nums1[i]); ++i,++j; } else if(nums1[i] > nums2[j]) { ++j; } else { ++i; } } return res; } };
|