您的位置:首页 > 其它

leetcode 350. Intersection of Two Arrays II

2016-07-16 10:47 323 查看
Given two arrays, write a function to compute their intersection.

Example:

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

首先想到的思路是直接遍历数组。这个时间复杂度是 O(mn),显然太高了

然后就想到先sort 再遍历数组。 时间复杂度 是O(mlgm + nlgn + m + n)

最后看下题目说万一 n 很大要在disk 上读取,所以想到了先把m load 进来存,然后用哈希,这样时间复杂度就是 O(n)

class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> intersection;
int m = nums1.size();
int n = nums2.size();
if (m == 0 || n == 0) return intersection;
unordered_map<int,int> hash;
for (int i = 0; i < m; i++) {
unordered_map<int, int>::iterator has = hash.find(nums1[i]);
if (has == hash.end()) hash[nums1[i]] = 1;
else has -> second += 1;
}
for (int i = 0; i < n; i++) {
unordered_map<int,int>::iterator has = hash.find(nums2[i]);
if (has != hash.end() && has -> second > 0) {
has -> second -= 1;
intersection.push_back(has -> first);
}
}
return intersection;
}
};


class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> intersection;
if(nums1.empty() || nums2.empty())
{
return intersection;
}
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
int m = nums1.size();
int n = nums2.size();
int i = 0,j = 0;
while(i < m && j < n)
{
if(nums1[i] < nums2[j])
{
i++;
}
else if(nums1[i] > nums2[j])
{
j++;
}
else
{
intersection.push_back(nums1[i]);
i++;
j++;
}
}
return intersection;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 函数