您的位置:首页 > 编程语言 > C语言/C++

349. Intersection of Two Arrays (sort) c++ (map方法需学习)

2018-03-11 16:28 344 查看
Description:
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.  

给定两个数组,编写函数返回它们的交集,
结果中的每个元素必须是唯一的。
结果可以是任意顺序的。                

思考:
这道题有多种解决方法,
可以使用hashtable (我不会)
可以使用set
可以使用unorder_set
可以使用普通的排序方法

1.使用set
首先要知道set:
set是STL中的标准关联容器,它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列。(如果需要集合中的元素允许重复那么可以使用multiset)

算法思路:
两个set存储两个vector的元素,然后比较两个set的元素是否相等(set内部已经排好序了)
借助set类型的迭代器进行遍历,找到相等元素后存储在vector<int>的result中,并移动指针
若不相等,指向较小元素的指针后移

class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {

// 可以用set实现,两个set存储两个vector的元素,然后比较两个set的元素

set<int>s1,s2;
vector<int>result;//存储结果
int i,j;
int n1=nums1.size(),n2=nums2.size();
for(i=0;i<n1;i++) s1.insert(nums1[i]); //将元素存入set中
for(i=0;i<n2;i++) s2.insert(nums2[i]);

set<int>::iterator it1=s1.begin(),it2=s2.begin(); //使用迭代器找到set的头元素

while(it1!=s1.end()&&it2!=s2.end())
{
if(*it1==*it2)
{
result.push_back(*it1);
it1++;
it2++;
}
else if(*it1<*it2) //不相等时,指针移动
it1++;
else
it2++;
}

return result;
}
};ps:这个方法用时10ms,效率感人,还需要改进

2.普通的排序
算法思路:
先将两个nums进行排序,然后对它们遍历逐个比较值的大小,注意要用一个标记数组记录已经放入结果的元素,防止有重复的元素被存入结果数组

class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {

sort(nums1.begin(), nums1.end()); //排序

sort(nums2.begin(), nums2.end());
vector<int> result; //存放结果
int mark; //标记

for (int i = 0, j = 0; i < nums1.size() && j < nums2.size(); )
{
if (nums1[i] < nums2[j])
i++;
else if (nums1[i] > nums2[j])
j++;
else
{
if(result.size()==0||mark!=nums1[i]) //判断条件不能少,不然会有重复元素存入结果
{
result.push_back(nums1[i]);
mark=nums1[i];
}
i++;
j++;
}
}
return result;

}
};ps:用时9ms,有点头大
还需要学习更好的方法才行,map的效率应该会更高
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: