题目解析
- 两个不同整数数组,其中两个数组均是无序且有多个重复项。
- 找到两个数组中的公共元素并返回。
- 此时,需要注意,返回值中并没有重复项,也就是如果数据均一致,返回一个数字即可。
算法原理
思路
就是将一个数组的数据,对照另一个数组的数据进行查找,查看是否有这个数字。想要快速得到在一堆数据中确定某个数据是否存在。
方法
哈希表
哈希表:想要快速的在一堆数据中找到某个数据是否存在。
步骤
- 先将一个数组数据放到一个哈希表中;
- 遍历另个数组,看这个数据是否在哈希表中;
- 如果在哈希表中,将这个数据添加到返回ret数组。
细节问题
问题一:生成哈希表问题
方法:容器 || 数组。
- 容器的缺点:不好写;时间消耗大。
- 能用数组最好用数组。
- 本题的数据范围1000,可以使用数组。
- 数组模拟一个bool类型的哈希表hash[1010]。
- 利用数组的下标来表示某一个数,用true和false来表示某一个数是否出现过。
问题二:数据重复的问题
- 加入结果之后,从哈希表中删除(将true改为false)。
编写代码
自己敲
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums1 int整型vector
* @param nums2 int整型vector
* @return int整型vector
*/
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// write code here
//将一个数组设置为哈希表
bool hash[1010]={false};
vector<int> ret;
for(int i =0;i<nums1.size();i++)
{
hash[nums1[i]]=true;
}
for(int i = 0;i<nums2.size();i++)
{
//遍历另一个数组判断某个数是否在hash中
int tmp=nums2[i];//遍历数组中的数据
//数据与哈希表中对应位置的数据进行判断是否为true
if(hash[nums2[i]]==true)
{
ret.push_back(nums2[i]);
hash[nums2[i]]=false;
}
}
return ret;
}
};
波哥敲
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums1 int整型vector
* @param nums2 int整型vector
* @return int整型vector
*/
bool hash[1010]={0};
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// write code here
vector<int> ret;
for(auto e:nums1)
{
hash[e]=1;
}
for(auto e:nums2)
{
if(hash[e]==1) ret.push_back(e);
hash[e]=0;
}
return ret;
}
};
反思总结
- 想快速在一堆数字中找到某个数字是否存在的方法:哈希表。
- 找数组A与数组B之间的共同值(不重复):将数组A设置为哈希表,数组A的数据为哈希表的角标,哈希表中角标是数组A数据的位置设置为true,其余为false。遍历数组B,数组B中的数据看做哈希表的角标,对应位置是true,则说明数组AB均有。
- 牛客网上定义数组如果不初始化,则是随机值,并不是0。
- 方法二利用:去重+排序+遍历查找+插入ret
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums1 int整型vector
* @param nums2 int整型vector
* @return int整型vector
*/
//两个数组交集
//两个数组中均有重复的数值且无需
//【思路】:去重+排序+遍历查找+插入ret
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// write code here
set<int> s1;
set<int> s2;
for(int i=0;i<nums1.size();i++)
{
s1.insert(nums1[i]);
}
for(int i=0;i<nums2.size();i++)
{
s2.insert(nums2[i]);
}
vector<int> ret;
for(auto e:s1)
{
if(s2.find(e)!=s2.end())
{
ret.push_back(e);
}
}
return ret;
}
};