【LeetCode350】两个数组的交集II(哈希表HashTable)

一、题目

在这里插入图片描述

二、思路

最简单的方法是哈希表,分别统计2个数组的哈希表,key为对应的元素,value为元素的个数,然后比较两个哈希表的key是公共时,取对应的最小value。主要是用java写下熟悉下语法:

  • HashtableputIfAbsent()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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35812205/article/details/126695970