题目
我的思路
直接暴力解就完事了。
但是在保证答案无重复的过程中,又想到了前几天刚学的新东西,正好也能用一用。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> num;
unordered_set<int> inter; //set的特性:不会有重复的值
for (int i = 0; i<nums1.size(); i++) {
for (int j = 0; j<nums2.size(); j++) {
if (nums1[i]==nums2[j]) {
inter.insert(nums1[i]);
break;
}
}
}
for (const auto& x : inter) {
num.push_back(x);
}
return num;
}
};
我跟题解一的方法有些相像,不过它确实比我的好。比我好的地方:
- 先遍历小的集合,减少遍历时间
- 在判断重复元素时,使用哈希集合,就可在 O(1) 的时间内判断一个元素是否在集合中 (
set2.count(num)
)
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> set1, set2;
for (auto& num : nums1) {
set1.insert(num);
}
for (auto& num : nums2) {
set2.insert(num);
}
return getIntersection(set1, set2);
}
vector<int> getIntersection(unordered_set<int>& set1, unordered_set<int>& set2) {
if (set1.size() > set2.size()) {
return getIntersection(set2, set1);
}
vector<int> intersection;
for (auto& num : set1) {
if (set2.count(num)) {
intersection.push_back(num);
}
}
return intersection;
}
};
题解二的方法我确实没想到,没这种意识。排序 + 双指针
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
int length1 = nums1.size(), length2 = nums2.size();
int index1 = 0, index2 = 0;
vector<int> intersection;
while (index1 < length1 && index2 < length2) {
int num1 = nums1[index1], num2 = nums2[index2];
if (num1 == num2) {
// 保证加入元素的唯一性
if (!intersection.size() || num1 != intersection.back()) {
intersection.push_back(num1);
}
index1++;
index2++;
} else if (num1 < num2) {
index1++;
} else {
index2++;
}
}
return intersection;
}
};
新东西
复习:set的声明
unordered_set<int> set1, set2;
判断一个元素是否在哈希集合中,使用
set2.count(num) //判断num是否在set2中,时间复杂度:O(1)
对vector进行排序
sort(nums1.begin(), nums1.end());