一、题目
二、思路
最简单的方法是哈希表,分别统计2个数组的哈希表,key为对应的元素,value为元素的个数,然后比较两个哈希表的key是公共时,取对应的最小value。主要是用java写下熟悉下语法:
Hashtable
的putIfAbsent()
和put
有点不同,从字面上看得出,前者是如果key和value在map中为空时才put进去,而后者是强行put(就是如果之前的哈希表中即使有对应的key,也会用当前新的value去覆盖之前的value)。putIfAbsent()
和put
相同点:如果哈希表中都没对应的key,则函数都会返回null。- 将动态数组
ArrayList
转为int[]
类型:ans.stream().mapToInt(Integer::valueOf).toArray()
。
三、代码
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
ArrayList<Integer> ans = new ArrayList<>();
HashMap<Integer, Integer> h1 = h(nums1);
HashMap<Integer, Integer> h2 = h(nums2);
//h1的所有key值
Set<Integer> keySet = h1.keySet();
//要找公共,所以直接从h1的哈希表开始即可
for(Integer integer: keySet){
if(h2.containsKey(integer)){
//若h2也有则进行比较h1和h2的value,取最小值
int temp_num = h1.get(integer) < h2.get(integer) ? h1.get(integer): h2.get(integer);
//这里有temp_num个integer是重复的
for(int i = 0; i < temp_num; i++){
ans.add(integer);
}
}
}
//return ans.stream().mapToInt(Integer::valueOf).toArray();
return ans.stream().mapToInt(Integer::valueOf).toArray();
}
//将数组nums转为哈希表
public HashMap<Integer, Integer> h(int[] nums){
HashMap<Integer, Integer> hashtable = new HashMap<>();
for(int num: nums){
//是否有这样的键值对(num, 1),若有则value则加1
if(hashtable.putIfAbsent(num, 1) != null){
hashtable.put(num, hashtable.putIfAbsent(num, 1) + 1);
}
}
return hashtable;
}
}