Problem:
Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, return [2]
.
- Each element in the result must be unique.
- The result can be in any order.
Summary:
求两集合交集。
Analysis:
1. 直接用了std中的find,遍历其中一个集合,查找其中的每个元素在另一个集合中是否存在。
1 class Solution { 2 public: 3 vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { 4 vector<int> res; 5 int len1 = nums1.size(), len2 = nums2.size(); 6 7 for (int i = 0; i < len1; i++) { 8 if (find(nums2.begin(), nums2.end(), nums1[i]) != nums2.end() && 9 find(res.begin(), res.end(), nums1[i]) == res.end()) { 10 res.push_back(nums1[i]); 11 } 12 } 13 14 return res; 15 } 16 };
2. sort + merge
首先将两个数组从小到大排序,后分别用两个指针指向两个数组开头比较大小,将小的数组指针后移。直至两指针指向数字相等时考虑将数字放入res中。
注意此处应考虑res中是否包含该数字。
1 class Solution { 2 public: 3 vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { 4 vector<int> res; 5 int len1 = nums1.size(), len2 = nums2.size(); 6 7 sort(nums1.begin(), nums1.end()); 8 sort(nums2.begin(), nums2.end()); 9 10 int i = 0, j = 0; 11 while (i < len1 && j < len2) { 12 if (nums1[i] < nums2[j]) { 13 i++; 14 } 15 else if (nums1[i] > nums2[j]) { 16 j++; 17 } 18 else { 19 if (res.empty() || res.back() != nums1[i]) { 20 res.push_back(nums1[i]); 21 } 22 23 i++; 24 j++; 25 } 26 } 27 28 return res; 29 } 30 };
3. Hash Table
1 class Solution { 2 public: 3 vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { 4 int len1 = nums1.size(), len2 = nums2.size(); 5 unordered_map<int, int> m; 6 vector<int> res; 7 8 for (int i = 0; i < len1; i++) { 9 if (!m[nums1[i]]) { 10 m[nums1[i]]++; 11 } 12 } 13 14 for (int i = 0; i < len2; i++) { 15 if (m[nums2[i]]) { 16 m[nums2[i]]--; 17 res.push_back(nums2[i]); 18 } 19 } 20 21 return res; 22 } 23 };