C++每日一練26-四數相加 II
四數相加 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 。所有整數的範圍在 -228 到 228 - 1 之間,最終結果不會超過 231 - 1 。
例如:
輸入: A = [ 1, 2] B = [-2,-1] C = [-1, 2] D = [ 0, 2]
輸出: 2
解釋: 兩個元組如下:
- (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0
- (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/4sum-ii
整體思路
利用前兩個數相加的結果構建雜湊表並且記錄重複的元素的次數,通過雜湊表來判斷後兩個數的負數與key相加結果是否等於0,記錄元素次數總和即可
C++程式碼:
class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
unordered_map<int, int> mapAB;
int ret = 0;
for (int& n1 : A) {
for (int& n2 : B) {//構建雜湊表
if (mapAB.find(n1 + n2) == mapAB.end()) {
mapAB[n1 + n2] = 1;
}
else {
mapAB[n1 + n2]++;
}
}
}
for (int& n3 : C) {
for (int& n4 : D) {
if (mapAB.find(-n3-n4) != mapAB.end()) {//查詢是否能存在相加為0的key
ret += mapAB[-n3 - n4];
}
}
}
return ret;
}
};
JAVA程式碼
class Solution {
public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
int ret=0;
Map<Integer,Integer> mapAB=new HashMap<Integer, Integer>();
for(int n1:A){
for(int n2:B){
mapAB.put(n1+n2,mapAB.getOrDefault(n1 + n2, 0) + 1);
}
}
for (int n3 : C) {
for (int n4 : D) {
if (mapAB.containsKey(-n3 - n4)) {
ret += mapAB.get(-n3 - n4);
}
}
}
return ret;
}
}
複雜度分析
時間複雜度: O(n^2) n為陣列的長度
空間複雜度:O(n^2)
相關文章
- 454_四數相加Ii
- Day 7| 454.四數相加II 、383. 贖金信 、15. 三數之和 、18. 四數之和
- 程式碼隨想錄演算法訓練營day07|454.四數相加II,383.贖金信,15.三數之和,18.四數之和演算法
- day7雜湊表 454.四數相加II |383. 贖金信|15. 三數之和 |18. 四數之和
- 程式碼隨想錄演算法訓練營第七天|第454題.四數相加II,383. 贖金信,第15題. 三數之和演算法
- LeetCode每日一題: 各位相加(No.258)LeetCode每日一題
- 10.5 每日一題 18. 四數之和每日一題
- hduoj1002 A + B Problem II (大數相加 字串模擬)字串
- [每日一題]140. Word Break II每日一題
- 程式碼隨想錄刷題day 7 | 雜湊表part02 454.四數相加II 383. 贖金信 15. 三數之和 18. 四數之和
- Q30 LeetCode454 四數相加2LeetCode
- 每日一練(24):在排序陣列中查詢數字排序陣列
- 每日一練(20):陣列中出現次數超過一半的數字陣列
- 每日一練(43):同構字串字串
- 每日一練(32):左旋轉字串字串
- 每日一練(37):實現 strStr()
- 每日一練(41):Excel表列名稱Excel
- 每日一練(42):Excel表序號Excel
- openGauss每日一練(全文檢索)
- PHP字串數字相加PHP字串
- 2. 兩數相加
- Leetcode:2. 兩數相加(C++帶詳細註釋)LeetCodeC++
- [每日一題] 第四題:圓圈中最後剩下的數字每日一題
- 萌新練習寫程式碼的每日一練:括號生成
- 每日一練(39):二進位制求和
- 每日一練(28):平衡二叉樹二叉樹
- Leetcode每日一題:52.N-Queens II(N皇后Ⅱ)LeetCode每日一題
- LeetCode——兩數相加LeetCode
- Leetcode兩數相加LeetCode
- 演算法-兩數相加演算法
- (陣列)大數相乘,相加陣列
- 字串分組相加方法四之總結字串
- 每日一練(46):兩個陣列的交集陣列
- 每日一練(27):二叉樹的深度二叉樹
- LeetCode每日一題: 按奇偶排序陣列 II(No.27)LeetCode每日一題排序陣列
- 程式設計題-兩數相加程式設計
- LeetCode 2——兩數相加LeetCode
- 【leetcode】【2、兩數相加】LeetCode