题意:给定两个数组,编写一个函数来计算它们的交集。
说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。
思路1:使用unordered_set
class Solution1 {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//创建一个方式最终结果的无须的set数组,他会自动的进行去重操作;
unordered_set<int> result_set;
//将vector类型的nums1放在nums_set中(即:将vector转换为unordered_set数组)
unordered_set<int> nums_set(nums1.begin(),nums1.end());
for (int num : nums2) {
//遍历nums2,并在原来的nums1中逐一查找元素,如果查找到,就放入结果数组中:
if (nums_set.find(num) != nums_set.end()) {
result_set.insert(num);
}
}
//最后返回一个匿名的vector数组:
return vector<int>(result_set.begin(), result_set.end());
}
};
思路2:使用数组
class Solution3 {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// 存放结果,之所以用set是为了给结果集去重
unordered_set<int> result_set;
int hash[1001] = { 0 };//默认数组元素均为0;
//将nums1中的数组做一个hash映射:
// nums1中出现的字母在hash数组中做记录
for (int i = 0; i < nums1.size();i++) {
hash[nums1[i]] = 1;
}
//然后再去nums2中去查找
for (int i = 0; i < nums2.size(); i++) {
//如果num2中对应位置的hash还是1,那就说明查找到了;
if (hash[nums2[i]] == 1) {
result_set.insert(nums2[i]);
}
}
//返回一个匿名的vector数组;
return vector<int>(result_set.begin(), result_set.end());
}
};
思路3:暴力解法
class Solution1 {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
set<int> s1;
for (int i = 0; i < nums1.size(); i++) {
for (int j = 0; j < nums2.size(); j++) {
//暴力解法,利用两层for循环,遇到相同的数字,就插入set中,set会自动进行去重;
if (nums1[i] == nums2[j]) {
s1.insert(nums1[i]);
}
}
}
// 使用构造函数调用将set转换为vector,直接return一个匿名的vector对象;
return vector<int> (s1.begin(), s1.end());
}
};