本文主要讲解两个数组的交集的细节与要点,主要使用unordered_set的方法解决
题目描述:给定两个数组
nums1
和nums2
,返回它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以不考虑输出结果的顺序 。
c++与java代码如下,末尾
1.要确定两个数组的交集,核心问题就是:判断一个元素是否都出现过,对于此类问题我们通常使用哈希表的方法来解决(元素是否出现过),另外这个题也是同样思想
2.具体选用哪种哈希表,我们通过思考本题只要求元素是否出现,并没有其他要求(数量等等),所以选择unordered_set,同时因为unordered_set自带除重的作用,重复的元素只记录一次。
3.执行流程:
首先,把nums1存入哈希表
其次,遍历nums2,看是否在哈希表中出现过,若出现就放进result
最后,返回result
4.小细节:注意最后输出的vector,但是如果我们直接新建一个vector,遍历nums2时一个个往进放,会导致重复的问题,例如[1,2,2,1]和[2,2],会重复放两个2。
解决办法:我们需要把result定义成一个unordered_set(自带去重),再把它转化成vector
c++代码如下
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> hashset(nums1.begin(),nums1.end());
unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
for (int i : nums2) {
if (hashset.find(i) != hashset.end()) {
result_set.insert(i);
}
}
//转化为vector
return vector<int>(result_set.begin(),result_set.end());
}
};
java代码如下,java中没有vector:
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if (nums1 == null || nums2 == null || nums1.length == 0 || nums2.length == 0) {
return new int[0];
}
Set<Integer> set1 = new HashSet<>();
Set<Integer> result = new HashSet<>();
//遍历数组1
for (int i : nums1) {
set1.add(i);
}
for (int i : nums2) {
if (set1.contains(i)) {
result.add(i);
}
}
/方法1:将结果集合转为数组
return result.stream().mapToInt(x -> x).toArray();
//方法2:另外申请一个数组存放setRes中的元素,最后返回数组
int[] arr = new int[result.size()];
int j = 0;
for(int i : result){
arr[j++] = i;
}
return arr;
}
}
学习自代码随想录