代码随想录DAY07

代码随想录DAY07 哈希表

454题: 四数相加

给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。
为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -2^28 到 2^28 - 1 之间,最终结果不会超过 2^31 - 1 。

启发:

1、自己只想到4层for循环的暴力解法。
2、联想到两数相加,这个是4个数相加,可以分成两两一组,就变成了两数相加。
3、先将A B数组中的元素依次相加存放在一个集合中,再将C D数组中的元素相加再依次遍历并去A B集合中找有没有相加为0的元素。因为涉及到快速查找某元素是否在集合中,想到哈希表
4、采用哪种哈希表?数组中的值可能很大,如果采用数组(数组的索引作为映射),可能会导致索引无法覆盖,也有可能结果是负数无法作为索引。set中只能存一个元素,但此题中不仅需要存数值还要存该数值出现的次数,因此考虑采用map。
5、map中存什么?首先记住需要查什么就将什么存在key中,此题中需要快速找到某个值,因此将两数相加的值作为key,将此值出现的次数作为value。

class Solution {
   
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
   
        Map<Integer, Integer> sum1 = new HashMap<Integer, Integer>();
        int result = 0;
        //将A B中的值相加后存在map中。
        for(int i = 0; i < nums1.length; i++){
   
            for(int j = 0; j < nums2.length; j++){
   
                int key = nums1[i] + nums2[j];
                if(sum1.containsKey(key)){
   
                    int temp = sum1.get(key) + 1;
                    sum1.put(key, temp);
                } else {
   
                    sum1.put(key, 1);
                }
            }
        }

        for(int i = 0; i < nums3.length; i++){
   
            for(int j = 0; j < nums4.length; j++){
   
                if

你可能感兴趣的:(leetcode,算法,数据结构,排序算法)