题目描述
题目:给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
说明:
输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。
双HashSet
做题思路
做这个题目之前我们应该了解一下HashSet的用途,不然代码可能不是特别容易理解。
HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。是无序的,允许有null值。我们就可以把他当成是一个不允许存取重复元素的容器就好。
然后我们来看一下题目描述,他的要求就是我们找出两个数组的交集,重复的时候则只保留一个,比如交集为[2,2]则我们只需输出[2]即可。
因为HashSet是不允许有重复元素的,所以我们先通过HashSet保存数组1的值(去重),然后我们再遍历数组2,判断HashSet里是否有数组2的值,如果含有则说明该值在两个数组都出现了,则保存到动态数组中。然后remove掉出现过的值,(可以看代码注释)遍历结束后,动态数组中保存的则是去重后的子集。该方法接近双100,还是挺不错的方法。
题目代码
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if(nums1.length == 0 || nums2.length == 0){
int[] arr = new int[0];
return arr;
}
//用来保留num1的去重结果
HashSet<Integer> num1set = new HashSet<Integer>();
//用来保存查询到的子集,动态数组,因为最后返回值是数组,
//但是我们现在不知道子集的元素有多少个,所以不可以直接定义数组
ArrayList<Integer> childarr = new ArrayList<Integer>();
//将数组1的值存到HashSet里
for(int i = 0 ;i < nums1.length ; i++){
num1set.add(nums1[i]);
}
//遍历数组2,判断是否在1中出现
for(int j = 0; j<nums2.length;j++){
if(num1set.contains(nums2[j])){
childarr.add(nums2[j]);
//这个是关键,防止重复插入,因为数组2里可能会有重复值。
//例num1=[1,2,1,3],num2=[2,1,1,4],子集为[1,2],HashSet值为[1,2,3]
//但是我们不加这一行的话,当我们遍历数组2,遍历到第一个1时,插入,第二个1仍会插入,所以需要remove出现过的值。
num1set.remove(nums2[j]);
}
}
//将arraylist元素保存到数组中
int[] renum = new int[childarr.size()];
for(int i = 0 ;i<childarr.size();i++){
renum[i] = childarr.get(i);
}
return renum;
}
}
总结
大家好我是袁厨,一位酷爱做饭自己考取了厨师证的菜鸡程序员,每天会为大家分享一道精选算法题,力求用最清晰的思路和最简单的方式给大家描述题目算法思想,微信搜索【程序员爱做饭】或扫描下方二维码关注我吧!
作者:LeetCode
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。