题目描述
给定两个数组,编写一个函数来计算它们的交集。
-
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2] -
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
说明:
输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
利用HashSet元素不重复的特性,使用两个HashSet,hs1用于寻找交集的数字,但寻找的结果又会产生重复数字(换句话说就是多次重复交集,比如数组一有1个2,数组二有n个2),需要用hs2来去除重复,并通过hs2的size确定int[]的长度。
代码详解
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> hs1 = new HashSet<>();
Set<Integer> hs2 = new HashSet<>();
int j = 0; // 添加至int[]时所需要的下标
for(int i = 0; i < nums1.length; ++i) {
hs1.add(nums1[i]); // nums1数组往hs1中添加元素,循环完得到nums1的所有数字(且保证每个数字仅出现一遍)
}
for(int i = 0; i < nums2.length; ++i) {
if(hs1.contains(nums2[i])) { // 若nums2中存在的数字在hs1中未出现,说明不是交集,跳过即可
hs2.add(nums2[i]); // 若出现了,把数字添加至hs2,防止重复添加,并最终确定int[]的长度
}
}
int[] nums = new int[hs2.size()]; // int[]的长度就是hs2的size
for(int n : hs2) { // 通过迭代器一个个添加至int[]中
nums[j] = n;
++j;
}
return nums;
}
}
注意点
- 注意结果nums中也不允许存在重复数字,且nums的长度也需要由hs2的size来确定。