您的位置:首页 > 其它

leetcode——Intersection of Two Arrays

2016-09-13 00:11 337 查看
原题目:

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.

解析:题目要求找出两个数组的交集。实现方法很多,下面介绍两种方法:
(1)先对两个数组进行排序,之后用两个初始为0的变量j,k分别指向两个数组,若nums1[j]=nums2[k],则将值加到结果中,因为nums1和nums2中元素可能重复,故应当增加j或k的值,使得nums1[j] != nums2[k];若nums1[j] < nums2[k],则j加1;否则另k加1。算法复杂度等于排序复杂度,即为O(nlogn)。

class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> v;
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
int j=0, k=0, l1=nums1.size(), l2=nums2.size();
while(j<l1 && k<l2)
{
if(nums1[j] == nums2[k])
{
v.push_back(nums1[j++]);
while(j<l1 && nums1[j]==nums1[j-1])	j ++;
}
else if(nums1[j] < nums2[k])	j ++;
else	k ++;
}
return v;
}
};


(2)利用集合set,先将其中一个数组的元素存进一个集合中,之后判断另一个集合中任一元素是否在集合中,在的话将该值加进结果中,并删去set中相应元素,防止重复。由于Set的添加及搜索复杂度为O(logn),算法复杂度为O(nlogn)。

class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
set<int> s;
vector<int> v;
for(int i=0; i<nums1.size(); i++)
if(s.find(nums1[i]) == s.end())
s.insert(nums1[i]);
for(int i=0; i<nums2.size(); i++)
if(s.find(nums2[i]) != s.end())
{
v.push_back(nums2[i]);
s.erase(nums2[i]);
}

return v;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息