diff --git a/README.en.md b/README.en.md index ee554f418..af0c4f777 100644 --- a/README.en.md +++ b/README.en.md @@ -95,7 +95,7 @@ The data structures mainly include: ![198.house-robber](./assets/problems/198.house-robber.png) -[0454.4-sum-ii](./problems/454.4-sum-ii.md): +[0454.4-sum-ii](./problems/454.4-sum-ii.en.md) ✅: ![454.4-sum-ii](./assets/problems/454.4-sum-ii.png) @@ -111,10 +111,6 @@ The data structures mainly include: > Here only lists some **representative problems** but not all. -<<<<<<< HEAD - -======= ->>>>>>> upstream/master #### Easy (Translation in Progress) - [0001.TwoSum](./problems/1.TwoSum.en.md)🆕✅ - [0020.Valid Parentheses](./problems/20.validParentheses.md) @@ -174,11 +170,7 @@ The data structures mainly include: - [0062.unique-paths](./problems/62.unique-paths.md) - [0073.set-matrix-zeroes](./problems/73.set-matrix-zeroes.md) - [0075.sort-colors](./problems/75.sort-colors.md) -<<<<<<< HEAD -- [0078.subsets](./problems/78.subsets.md) -======= - [0078.subsets](./problems/78.subsets-en.md)✅ ->>>>>>> upstream/master - [0079.word-search](./problems/79.word-search-en.md) ✅ - [0086.partition-list](./problems/86.partition-list.md) - [0090.subsets-ii](./problems/90.subsets-ii-en.md)✅ @@ -224,10 +216,7 @@ The data structures mainly include: - [0516.longest-palindromic-subsequence](./problems/516.longest-palindromic-subsequence.md) - [0518.coin-change-2](./problems/518.coin-change-2.md) - [0547.friend-circles](./problems/547.friend-circles-en.md) 🆕✅ -<<<<<<< HEAD -======= - [0560.subarray-sum-equals-k](./problems/560.subarray-sum-equals-k.en.md) ✅ ->>>>>>> upstream/master - [0609.find-duplicate-file-in-system](./problems/609.find-duplicate-file-in-system.md) - [0875.koko-eating-bananas](./problems/875.koko-eating-bananas.md) - [0877.stone-game](./problems/877.stone-game.md) @@ -240,10 +229,6 @@ The data structures mainly include: - [1371.find-the-longest-substring-containing-vowels-in-even-counts](./problems/1371.find-the-longest-substring-containing-vowels-in-even-counts.en.md) 🆕✅ -<<<<<<< HEAD - -======= ->>>>>>> upstream/master #### Hard (Translation in Progress) - [0004.median-of-two-sorted-array](./problems/4.median-of-two-sorted-array.md) 🆕 diff --git a/problems/454.4-Sum-ii.en.md b/problems/454.4-Sum-ii.en.md new file mode 100644 index 000000000..5a5d0eb82 --- /dev/null +++ b/problems/454.4-Sum-ii.en.md @@ -0,0 +1,100 @@ + + +## Problem Address +https://leetcode.com/problems/4sum-ii/description/ + +## Problem Description + +``` +Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such that A[i] + B[j] + C[k] + D[l] is zero. + +To make problem a bit easier, all A, B, C, D have same length of N where 0 ≤ N ≤ 500. All integers are in the range of -228 to 228 - 1 and the result is guaranteed to be at most 231 - 1. + +Example: + +Input: +A = [ 1, 2] +B = [-2,-1] +C = [-1, 2] +D = [ 0, 2] + +Output: +2 + +Explanation: +The two tuples are: +1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0 +2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0 +``` +## Solution + +The normal solution to complete the search would require four rounds of traversal, and that would make the time complexity reaches O(n^4), which doesn't work obviously. We have to figure out a more effective algorithm. + +My idea is to separate these four lists into two groups and combine them two by two. We then calculate separately `all the sums from these two groups, and the relevant counts` + +As the picture shows: + +![454.4-sum-ii](../assets/problems/454.4-sum-ii.png) + + +Now that we got two `hashTable`, and the result would appear with some basic calculations. + +## Key Point Analysis +- Less time by more space. +- Divide the lists by 2, and calculate all the possible sums from two groups, then combine the result. + +## Code + +Language Support: `JavaScript`,`Python3` + +`JavaScript`: +```js + +/* + * @lc app=leetcode id=454 lang=javascript + * + * [454] 4Sum II + * + * https://leetcode.com/problems/4sum-ii/description/ +/** + * @param {number[]} A + * @param {number[]} B + * @param {number[]} C + * @param {number[]} D + * @return {number} + */ +var fourSumCount = function(A, B, C, D) { + const sumMapper = {}; + let res = 0; + for (let i = 0; i < A.length; i++) { + for (let j = 0; j < B.length; j++) { + sumMapper[A[i] + B[j]] = (sumMapper[A[i] + B[j]] || 0) + 1; + } + } + + for (let i = 0; i < C.length; i++) { + for (let j = 0; j < D.length; j++) { + res += sumMapper[- (C[i] + D[j])] || 0; + } + } + + return res; +}; +``` + +`Python3`: + +```python +class Solution: + def fourSumCount(self, A: List[int], B: List[int], C: List[int], D: List[int]) -> int: + mapper = {} + res = 0 + for i in A: + for j in B: + mapper[i + j] = mapper.get(i + j, 0) + 1 + + for i in C: + for j in D: + res += mapper.get(-1 * (i + j), 0) + return res + ``` \ No newline at end of file