LeetCode - 454. 四数相加 II

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 。所有整数的范围在 − 2 28 -2^{28} 228 2 28 − 1 2^{28} - 1 2281 之间,最终结果不会超过 2 31 − 1 2^{31} - 1 2311

解题思路: 一开始想到的是将4个数组做排序,然后确定三个数组的值,然后用二分查找法找第4个数组的值,但是最后超时了,因为test case里面有一个非常大的case,最后看了一下题目的标签,考察哈希,然后先统计两个数组的值,在遍历另外两个数组时,用哈希进行查找,这样算法复杂度就由原来的 O ( n 3 l o g n ) O(n^3logn) O(n3logn)降低为 O ( n 2 ) O(n^2) O(n2)

class Solution {
     
public:
    int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
     
        unordered_map<int, int> m1;
        int res = 0;
        for (auto &a : A) {
     
            for (auto b : B) {
     
                ++m1[a + b];
            }
        }
        for (auto &c : C) {
     
            for (auto d : D) {
     
                if (m1.count(-(c + d))) res += m1[-(c + d)];
            }
        }
        return res;
    }
};

你可能感兴趣的:(leetcode,leetcode)