# 454. 4Sum II - LeetCode Best Practices Visit original link: [454. 4Sum II - LeetCode Best Practices](https://leetcoder.net/en/leetcode/454-4sum-ii) for a better experience! LeetCode link: [454. 4Sum II](https://leetcode.com/problems/4sum-ii), difficulty: **Medium**. ## LeetCode description of "454. 4Sum II" Given four integer arrays `nums1`, `nums2`, `nums3`, and `nums4` all of length `n`, return the number of tuples `(i, j, k, l)` such that: - `0 <= i, j, k, l < n` - `nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0` ### [Example 1] **Input**: `nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]` **Output**: `2` **Explanation**:

The two tuples are:

  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
### [Example 2] **Input**: `nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]` **Output**: `1` ### [Constraints] - `n == nums1.length` - `n == nums2.length` - `n == nums3.length` - `n == nums4.length` - `1 <= n <= 200` - `-2^28 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 2^28` ## Intuition 1. Because the final requirement is to take one number from each group of numbers, the four groups of numbers can be split into **two groups of two**. 2. Count the number of each `sum`. Use `Map` to store, `key` is `sum`, `value` is `count`. 3. Iterate over `nums3` and `nums4`, if `-(num3 + num4)` exists in `keys` of `Map`, then `count` is included in the total. ## Steps 1. Count the number of each `sum`. Use `Map` to store, `key` is `sum`, `value` is `count`. ```python num_to_count = defaultdict(int) for num1 in nums1: for num2 in nums2: num_to_count[num1 + num2] += 1 ``` 2. Iterate over `nums3` and `nums4`, if `-(num3 + num4)` exists in `keys` of `Map`, then `count` is included in the total. ```python result = 0 for num3 in nums3: for num4 in nums4: result += num_to_count[-(num3 + num4)] return result ``` ## Complexity - Time complexity: `O(N * N)`. - Space complexity: `O(N)`. ## Java ```java class Solution { public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { var numToCount = new HashMap(); for (var num1 : nums1) { for (var num2 : nums2) { numToCount.put( num1 + num2, numToCount.getOrDefault(num1 + num2, 0) + 1 ); } } var result = 0; for (var num3 : nums3) { for (var num4 : nums4) { result += numToCount.getOrDefault(-(num3 + num4), 0); } } return result; } } ``` ## Python ```python # from collections import defaultdict class Solution: def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int: num_to_count = defaultdict(int) for num1 in nums1: for num2 in nums2: num_to_count[num1 + num2] += 1 result = 0 for num3 in nums3: for num4 in nums4: result += num_to_count[-(num3 + num4)] return result ``` ## JavaScript ```javascript var fourSumCount = function (nums1, nums2, nums3, nums4) { const numToCount = new Map() for (const num1 of nums1) { for (const num2 of nums2) { numToCount.set(num1 + num2, (numToCount.get(num1 + num2) || 0) + 1) } } let result = 0 for (const num3 of nums3) { for (const num4 of nums4) { result += numToCount.get(-(num3 + num4)) || 0 } } return result }; ``` ## C# ```csharp public class Solution { public int FourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { var numToCount = new Dictionary(); foreach (int num1 in nums1) { foreach (int num2 in nums2) { numToCount[num1 + num2] = numToCount.GetValueOrDefault(num1 + num2, 0) + 1; } } int result = 0; foreach (int num3 in nums3) { foreach (int num4 in nums4) { result += numToCount.GetValueOrDefault(-(num3 + num4), 0); } } return result; } } ``` ## Ruby ```ruby def four_sum_count(nums1, nums2, nums3, nums4) num_to_count = Hash.new(0) nums1.each do |num1| nums2.each do |num2| num_to_count[num1 + num2] += 1 end end result = 0 nums3.each do |num3| nums4.each do |num4| result += num_to_count[-(num3 + num4)] end end result end ``` ## Go ```go func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int { // Create map to store sum frequencies from first two arrays sumCount := make(map[int]int) // Calculate all possible sums from nums1 and nums2 for _, num1 := range nums1 { for _, num2 := range nums2 { sumCount[num1 + num2]++ } } result := 0 // Check complementary sums from nums3 and nums4 for _, num3 := range nums3 { for _, num4 := range nums4 { // Add count of complementary sum that would make total zero result += sumCount[-(num3 + num4)] } } return result } ``` ## C++ ```cpp class Solution { public: int fourSumCount(vector& nums1, vector& nums2, vector& nums3, vector& nums4) { // Store sum frequencies from first two arrays unordered_map sumCount; // Calculate all possible sums from nums1 and nums2 for (int num1 : nums1) { for (int num2 : nums2) { sumCount[num1 + num2]++; } } int result = 0; // Check complementary sums from nums3 and nums4 for (int num3 : nums3) { for (int num4 : nums4) { // Add occurrences of required complement sum result += sumCount[-(num3 + num4)]; } } return result; } }; ``` ## Other languages ```java // Welcome to create a PR to complete the code of this language, thanks! ``` Dear LeetCoders! For a better LeetCode problem-solving experience, please visit website [leetcoder.net](https://leetcoder.net): Dare to claim the best practices of LeetCode solutions! Will save you a lot of time! Original link: [454. 4Sum II - LeetCode Best Practices](https://leetcoder.net/en/leetcode/454-4sum-ii). GitHub repository: [f*ck-leetcode](https://github.com/fuck-leetcode/fuck-leetcode).