[LeetCode] 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
-228 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 228
四数相加II。
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/4sum-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 - 1 之间,最终结果不会超过 2^31 - 1。
思路是hashmap。将A和B分为一组,C和D分为一组。因为求的是A + B + C + D = 0,所以能得出结论A + B = -C - D。按照这个思路,求出A + B的和的所有可能,存在hashmap里面,key是A + B的和,value是出现次数。所以当算完A + B的所有可能之后,再遍历C和D,找-C - D是否在hashmap里出现过,若出现过,则直接将出现次数加到结果中。
时间O(n^2)
空间O(n)
Java实现
1 class Solution { 2 public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { 3 HashMap<Integer, Integer> map = new HashMap<>(); 4 int res = 0; 5 for (int num1 : nums1) { 6 for (int num2 : nums2) { 7 int sum = num1 + num2; 8 map.put(sum, map.getOrDefault(sum, 0) + 1); 9 } 10 } 11 12 for (int num3 : nums3) { 13 for (int num4 : nums4) { 14 int comp = 0 - num3 - num4; 15 res += map.getOrDefault(comp, 0); 16 } 17 } 18 return res; 19 } 20 }
JavaScript实现
1 /** 2 * @param {number[]} A 3 * @param {number[]} B 4 * @param {number[]} C 5 * @param {number[]} D 6 * @return {number} 7 */ 8 var fourSumCount = function (A, B, C, D) { 9 let map = new Map(), 10 ans = 0, 11 n = A.length; 12 13 for (let i = 0; i < n; i++) { 14 let a = A[i]; 15 for (let j = 0; j < n; j++) { 16 let b = B[j]; 17 if (!map.has(a + b)) { 18 map.set(a + b, 1); 19 } else { 20 map.set(a + b, map.get(a + b) + 1); 21 } 22 } 23 } 24 25 for (let k = 0; k < n; k++) { 26 let c = C[k]; 27 for (let l = 0; l < n; l++) { 28 let d = D[l]; 29 let sum = -(c + d); 30 if (map.has(sum)) { 31 ans += map.get(sum); 32 } 33 } 34 } 35 return ans; 36 };