您的位置:首页 > 其它

leecode 解题总结:349. Intersection of Two Arrays

2017-03-01 22:17 519 查看
#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
#include <unordered_set>
using namespace std;
/*
问题:
Given two arrays, write a function to compute their intersection.

Example:
Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2].

Note:
Each element in the result must be unique.
The result can be in any order.

分析:给定两个数组,计算连个数组的交集,交集中的每个元素必须是唯一的。
结果可以是任何顺序。
关键就是判断两个区间如何才会相交,距离
[beg1 , end1],[beg2 , end2]
1】当 end1 >= beg2:
1.1】 end1 >= end2,交集为[max(beg1 , beg2) , end2]
1.2]  end1 < end2:交集为[beg2 , end1]
2】当 end2 >= beg1:
2.1】 end2 >= end1,交集为[max(beg1, beg2) , end1]
2.2】 end2 < end1, 交集为[beg1 , end2]

输入:
4(第一个数组的元素个数) 2(第二个数组的元素个数)
1 2 2 1
2 2
输出:
2

题目是求两个数组中元素的交集,不是区间。弄错题意。
关键:
1 所谓交集,就是同时在两个数组中都出现的,不妨用两个哈希map
分别统计两个数组,然后遍历其中一个哈希map,判断该map中的元素
如果在另一个map中也出现,则将其存储至结果集
总的时间复杂度O(n)

2 哈希set初始化可以直接传入vector
unordered_set<int> m(nums1.begin(), nums1.end());
*/

class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
if(nums1.empty() || nums2.empty())
{
return result;
}
unordered_set<int> times1;
int size1 = nums1.size();
for(int i = 0 ; i < size1 ; i++)
{
times1.insert(nums1.at(i));
}
unordered_set<int> times2;
int size2 = nums2.size();
for(int i = 0 ; i < size2 ; i++)
{
times2.insert(nums2.at(i));
}

//用较小的map作为主map进行遍历
for(unordered_set<int>::iterator it = times1.begin() ; it != times1.end() ; it++)
{
if(times2.find(*it) != times2.end())
{
result.push_back(*it);
}
}
return result;
}
};

void print(vector<int>& result)
{
if(result.empty())
{
cout << "no result" << endl;
return;
}
int size = result.size();
for(int i = 0 ; i < size ; i++)
{
cout << result.at(i) << " " ;
}
cout << endl;
}

void process()
{
vector<int> nums;
vector<int> nums2;
int value;
int num;
int num2;
Solution solution;
vector<int> result;
while(cin >> num >> num2)
{
nums.clear();
for(int i = 0 ; i < num ; i++)
{
cin >> value;
nums.push_back(value);
}
nums2.clear();
for(int i = 0 ; i < num2 ; i++)
{
cin >> value;
nums2.push_back(value);
}
result = solution.intersection(nums , nums2);
print(result);
}
}

int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: