每日一题.454. 四数相加 II

给定四个包含整数的数组列表 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 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。

我的解法:定义数据结构存储A[i]+B[j]出现的所有可能,首先想到使用HashSet,但由于A[i]+B[j]的值可能不止出现一次,且若匹配每次出现的值都会使结果+1,因此采用HashMap存储,HashMap的key为可能出现的值,value为值出现的次数。然后求C[i]+D[j]的值,判断HashMap中是否存在以-(C[i]+D[j])为key的键值对,若存在说明匹配,key对应的value即为新增的结果数。

时间复杂度:O(n2),空间复杂度:O(n)

class Solution {
    public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
        /*定义哈希表存储A和B相加的所有可能结果,及其出现的次数*/
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        for (int i = 0; i < A.length; i++) {
            for (int j = 0; j < B.length; j++) {
                int sum = A[i] + B[j];
                if (hashMap.containsKey(sum)) {
                    hashMap.put(sum, hashMap.get(sum)+1);
                } else {
                    hashMap.put(sum, 1);
                }
            }
        }
        int res = 0;
        for (int i = 0; i < C.length; i++) {
            for (int j = 0; j < D.length; j++) {
                int sum = C[i] + D[j];
                if (hashMap.containsKey(-sum)) {
                    /*若匹配,则会增加hashMap.get(-sum)个结果*/
                    res += hashMap.get(-sum);
                }
            }
        }
        return res;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容