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
這題最暴力的解法,就是找出所有和,這樣時間複雜度會是 O(n^4)
使用 hash map 來做簡化到 O(n^2)
- 用兩個 hash map 來存 A+B 和 C+D 的所有情況
- 如果 A+B+C+D 可以等於 0,那就代表 A+B = -(C+D)。因此,可以用 map[-(A+B)] 來看是不是存在相對應的 C+D
C++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
public: | |
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) { | |
int ans = 0; | |
unordered_map<int, int> map; | |
const int len = A.size(); | |
for(int i = 0; i < len; i++) { | |
for(int j = 0; j < len; j++) { | |
map[A[i] + B[j]]++; | |
} | |
} | |
int sum; | |
for(int i = 0; i < len; i++) { | |
for(int j = 0; j < len; j++) { | |
sum = -(C[i]+D[j]); | |
ans += (map.find(sum) != map.end()) ? map[sum] : 0; | |
} | |
} | |
return ans; | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Solution { | |
public int fourSumCount(int[] A, int[] B, int[] C, int[] D) { | |
int ans = 0; | |
HashMap<Integer, Integer> hashMap = new HashMap<>(); | |
final int len = A.length; | |
int sum; | |
//>> calculate all combinations of A and B | |
for(int i = 0; i < len; i++) { | |
for(int j = 0; j < len; j++) { | |
sum = A[i] + B[j]; | |
hashMap.put(sum, hashMap.getOrDefault(sum, 0) + 1); | |
} | |
} | |
//>> find the counter part of A+B | |
for(int i = 0; i < len; i++) { | |
for(int j = 0; j < len; j++) { | |
ans += hashMap.getOrDefault(-1 * (C[i] + D[j]), 0); | |
} | |
} | |
return ans; | |
} | |
} |
沒有留言:
張貼留言