返回介绍

solution / 0400-0499 / 0454.4Sum II / README

发布于 2024-06-17 01:04:00 字数 3845 浏览 0 评论 0 收藏 0

454. 四数相加 II

English Version

题目描述

给你四个整数数组 nums1nums2nums3nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

 

示例 1:

输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
输出:2
解释:
两个元组如下:
1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0

示例 2:

输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
输出:1

 

  提示:

  • n == nums1.length
  • n == nums2.length
  • n == nums3.length
  • n == nums4.length
  • 1 <= n <= 200
  • -228 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 228

解法

方法一:哈希表

我们可以将数组 $nums1$ 和 $nums2$ 中的元素 $a$ 和 $b$ 相加,将所有可能的和存储在哈希表 $cnt$ 中,其中键为两数之和,值为两数之和出现的次数。

然后我们遍历数组 $nums3$ 和 $nums4$ 中的元素 $c$ 和 $d$,令 $c+d$ 为目标值,那么答案即为 $cnt[-(c+d)]$ 的累加和。

时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$,其中 $n$ 是数组的长度。

class Solution:
  def fourSumCount(
    self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]
  ) -> int:
    cnt = Counter(a + b for a in nums1 for b in nums2)
    return sum(cnt[-(c + d)] for c in nums3 for d in nums4)
class Solution {
  public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
    Map<Integer, Integer> cnt = new HashMap<>();
    for (int a : nums1) {
      for (int b : nums2) {
        cnt.merge(a + b, 1, Integer::sum);
      }
    }
    int ans = 0;
    for (int c : nums3) {
      for (int d : nums4) {
        ans += cnt.getOrDefault(-(c + d), 0);
      }
    }
    return ans;
  }
}
class Solution {
public:
  int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
    unordered_map<int, int> cnt;
    for (int a : nums1) {
      for (int b : nums2) {
        ++cnt[a + b];
      }
    }
    int ans = 0;
    for (int c : nums3) {
      for (int d : nums4) {
        ans += cnt[-(c + d)];
      }
    }
    return ans;
  }
};
func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) (ans int) {
  cnt := map[int]int{}
  for _, a := range nums1 {
    for _, b := range nums2 {
      cnt[a+b]++
    }
  }
  for _, c := range nums3 {
    for _, d := range nums4 {
      ans += cnt[-(c + d)]
    }
  }
  return
}
function fourSumCount(nums1: number[], nums2: number[], nums3: number[], nums4: number[]): number {
  const cnt: Map<number, number> = new Map();
  for (const a of nums1) {
    for (const b of nums2) {
      const x = a + b;
      cnt.set(x, (cnt.get(x) || 0) + 1);
    }
  }
  let ans = 0;
  for (const c of nums3) {
    for (const d of nums4) {
      const x = c + d;
      ans += cnt.get(-x) || 0;
    }
  }
  return ans;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文