四数相加 II

83 阅读1分钟
  • 题目
    给你四个整数数组 nums1nums2nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
  • 解题思路:
    这道题目虽然是四个数,但我们通过加法操作也可以让四个数变为两个数,这样就转换成需要在集合中查找元素是否存在的问题。
    因此考虑使用哈希表,而这道题还需要记录出现了多少个满足条件的元素,因此应该使用map哈希表。
    具体操作如下:
    (1)将nums1和nums2中的元素进行两两相加,因为这道题不需要考虑相同的元素,因此两两相加即可;使用map的key键存放相加后元素的值,使用map的value键存放该相加后的元素值出现的次数。
    (2)第二步,遍历数组nums3和nums4,将其元素两两相加,和map中的元素进行比较,只要符合条件,定义count,累加count记录满足条件的次数。

  • 代码如下:

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        // 四数之和
        // 定义一个map,用来存放nums1和nums2中的元素之和
        int res = 0;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i : nums1) {
            for (int j : nums2) {
                int temp = i + j;
                if (map.containsKey(temp)){
                    map.put(temp,map.get(temp) + 1);
                }else {
                    map.put(temp,1);
                }
            }
        }
        for (int i : nums3) {
            for (int  j : nums4) {
                int temp = i + j;
                if (map.containsKey(0-temp)){
                    res += map.get(0 - temp);
                }
            }

        }
        return res;
    }
}