题目:
给定两个数组,编写一个函数来计算它们的交集。
解:
思路:
方法一:
使用哈希表。
始终使前一个数组为长度小的,后一个为数组长度大的。
外层遍历小数组,内层遍历大数组。判断二者元素的值,分为三种情况:
1、外层 != 内层,不做任何操作,继续遍历
2、外层 = 内层,且不存在哈希表中,将该元素添加到哈希表中,为键,对应的值为 1,结束此次内层循环
3、外层 = 内层,且已经存在哈希表中,因为此时内层元素是重复遍历,应该跳过重复该元素的次数即哈希表中该元素的值,
4、外层 = 内层,且已经存在哈希表中,但已经通过步骤 3 跳过了重复元素,如果还有相等的元素,则哈希表中对应值 加 1
!
代码:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2)
{
hash_map<int, int> hm;
hash_map<int, int> ::iterator itmap = hm.begin();
vector<int> nums3;
if (nums1.size() > nums2.size())
{
nums3 = nums2, nums2 = nums1, nums1 = nums3; // 1 为个数小的 2为个数大的
}
for (int i = 0;i < nums1.size();i++)
{
int tag = hm[nums1[i]];
for (int j = 0;j < nums2.size();j++)
{
// 如果1 中的值在2 中也有,并且没有在 哈希表中,就添加进去
if (nums1[i] == nums2[j] && hm[nums1[i]] == 0)
{
hm[nums1[i]] = 1;
break;
}
// 如果1 中的值在2 中也有,但哈希表已经存在,且已经记过数
else if (nums1[i] == nums2[j] && hm[nums1[i]] != 0 && tag != 0)
{
tag--;
continue;
}
// 如果1 中的值在2 中也有,但哈希表已经存在,就对应值 +1
else if (nums1[i] == nums2[j] && hm[nums1[i]] != 0 && tag == 0)
{
int key = hm[nums1[i]] + 1;
hm[nums1[i]] = key;
break;
}
}
}
// 将结果写入 vector
nums3.clear();
itmap = hm.begin();
while (itmap != hm.end())
{
for (int i = 0;i < itmap->second;i++)
{
nums3.push_back(itmap->first);
}
//cout << itmap->first << " " << itmap->second << "\n";
itmap++;
}
return nums3;
}
方法二:
将数组1、2进行排序,并使用 STL 的OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result) 求交集函数直接获取结果
代码:
vector<int> intersect1(vector<int>& nums1, vector<int>& nums2)
{
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
vector<int> result;
set_intersection(nums1.begin(), nums1.end(), nums2.begin(), nums2.end(), back_inserter(result));
return result;
}