哈希表--四数相加II

38 阅读1分钟

题意: 给定四个包含整数的数组列表 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 。

例如:

输入:

  • A = [ 1, 2]
  • B = [-2,-1]
  • C = [-1, 2]
  • D = [ 0, 2]

输出: 2

代码:

public class FourNumberAdd {
    public static int fourNumberAdd(int[] A, int[] B, int[] C, int[] D) {
        Map<Integer, Integer> records = new HashMap<>();
        for (int a : A) {
            for (int b : B) {
                if (records.containsKey(a + b)) {
                    records.put(a+b, records.get(a+b)+1);
                } else {
                    records.put(a+b, 1);
                }
            }
        }

        int count = 0;
        for (int c : C) {
            for (int d : D) {
                int tmp = 0 - c - d;
                if (records.containsKey(tmp)) {
                    count += records.get(tmp);
                }
            }
        }
        return count;
    }

    public static void main(String[] args) {
        int[] A = {1,2};
        int[] B = {-2,-1};
        int[] C = {-1,2};
        int[] D = {0,2};
        System.out.println(fourNumberAdd(A, B, C, D));
    }
}