
解题思路:
1.统计数组中每个元素的值出现的次数,也就是每个元素出现了多少次
2.遍历一个数组 nums2,找另一个数组nums1。
3.如果当前被遍历到值 num 在nums1中存在,那么,去找 num 出现的次数。
4.在遍历时,我们需要通过查找是否出现,即
if(countMap.find(num) != countMap.end())
C++ 函数 std::unordered_map::find() 查找与键 k 关联的元素。
如果操作成功,则方法返回指向元素的迭代器,否则返回指向 map::end() 的迭代器。
声明
以下是 std::unordered_map::find() 函数形式 std::unordered_map 头的声明。
C++11
iterator find (const key_type& k); const_iterator find (const key_type& k) const;
查看当前被遍历的元素是否出现,那么,如果 if 值为真,即表示这元素是交集,我将这个元素插入到新的数组中,遍历结束就可以得到nums2中的元素交集
5.根据题目条件,需要插入的数量因该是出现数量较少的。那么,就需要限制 if 语句的条件。根据出现次数,如果每遍历到一个值,我就将nums1中这个值的出现次数 -1 那么,当nums1中对应元素的出现次数,也就是值为 0 的时候,通过 if 为真,插入的数据就是最少的。因为nums1 和nums2的出现次数是同时消耗的,当这个计数为 0 的时候,即最少的一方被消耗完了
//遍历nums2,如果在countMap中存在,计数-1
for (auto num : nums2)
{
if (countMap.find(num) != countMap.end() && countMap[num] > 0)
{
result.push_back(num);
countMap[num]--;
}
}
完整代码:
// 两个数组的交集2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<vector>
#include <unordered_map>
using namespace std;
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2)
{
unordered_map<int, int>countMap;
//先统计nums1中每个元素出现的次数
for (auto num : nums1) {
countMap[num]++;
}
vector<int>result;
//遍历nums2,如果在countMap中存在,计数-1
for (auto num : nums2) {
if (countMap.find(num) != countMap.end() && countMap[num] > 0) {
result.push_back(num);
countMap[num]--;
}
}
return result;
}
};
int main() {
Solution solution;
// 测试1
vector<int> nums1 = { 1, 2, 2, 1 };
vector<int> nums2 = { 2, 2 };
vector<int> result1 = solution.intersect(nums1, nums2);
cout << "测试1: ";
for (int num : result1) {
cout << num << " ";
}
cout << endl;
// 测试2
vector<int> nums3 = { 4, 9, 5 };
vector<int> nums4 = { 9, 4, 9, 8, 4 };
vector<int> result2 = solution.intersect(nums3, nums4);
cout << "测试2: ";
for (int num : result2) {
cout << num << " ";
}
cout << endl;
return 0;
}
本文介绍了一种使用C++编程语言解决数组交集问题的方法,通过unordered_map统计两个数组中元素的出现次数,然后遍历第二个数组,找出在第一个数组中也存在的元素及其出现次数,从而找到最少出现次数的元素作为交集。
566

被折叠的 条评论
为什么被折叠?



