【LeetCode350】两个数组的交集II(哈希表HashTable)
【摘要】
一、题目
二、思路
最简单的方法是哈希表,分别统计2个数组的哈希表,key为对应的元素,value为元素的个数,然后比较两个哈希表的key是公共时,取对应的最小value。主要是用java写下熟悉...
一、题目
二、思路
最简单的方法是哈希表,分别统计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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。
原文链接:andyguo.blog.csdn.net/article/details/126695970
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)