题目描述
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
说明:
输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。
解法(java版):
解题描述:
1、看结果中是不存在重复元素的,所以第一步要去重,自然地就想到了Set和Map(map的key重复会覆盖,但是因为没有value,所以用set),set中的元素(注意重写元素的equals和hashCode方法,否则会当成同一对象,Obejct.hashCode()的默认实现是为每一个对象生成不同的int数值,它本身是native,与内存地址有关)
public class Title349 {
public int[] intersection(int[] nums1, int[] nums2) {
if(null==nums1||null==nums2||nums1.length==0||nums2.length==0){
return new int[0];
}
Set setNums1 = new HashSet<>();
Set result = new HashSet();
for (int value : nums1) {
setNums1.add(value);
}
for (int value : nums2) {
//set的底层是HashMap,map存储是数组+链表,找到数组的位置是O(1),在链表是顺序查找
if (setNums1.contains(value)) {
result.add(value);
}
}
int[] res = new int[result.size()];
int i=0;
Iterator iterator = result.iterator();
while (iterator.hasNext()) {
res[i++]= (int) iterator.next();
}
return res;
}
public int[] intersectionMap(int[] nums1, int[] nums2) {
if(null==nums1||null==nums2||nums1.length==0||nums2.length==0){
return new int[0];
}
//注意初始化大小,否则会引起频繁扩容
Map setNums1 = new HashMap();
Map result = new HashMap();
for (int value : nums1) {
setNums1.put(value,null);
}
for (int value : nums2) {
if (setNums1.containsKey(value)) {
result.put(value,null);
}
}
int[] res = new int[result.size()];
int i=0;
Iterator iterator = result.keySet().iterator();
while (iterator.hasNext()) {
res[i++]= (int)iterator.next();
}
return res;
}
public static void main(String[] args) {
int[] nums1={1,2,2,1};
int[] nums2={2,2};
//set
int[] arr=new Title349().intersection(nums1,nums2);
for(int value:arr){
System.out.println(value);
}
int[] nums3={4,9,5};
int[] nums4={9,4,9,8,4};
//map
int[] arr2=new Title349().intersectionMap(nums3,nums4);
for(int value:arr2){
System.out.println(value);
}
}
}
gain:
1、注意代码的书写
2、如果是数组都转成set的话,会进行多余的计算