【一天一大 lee】四數相加 II (難度:中等) - Day20201127
題目:
給定四個包含整數的陣列列表 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 2 8 -2^28 −228 到 2 2 8 2^28 228 - 1 之間,最終結果不會超過 2 3 1 2^31 231 - 1 。
示例:
輸入:
A = [ 1, 2]
B = [-2,-1]
C = [-1, 2]
D = [ 0, 2]
輸出:
2
解釋:
兩個元組如下:
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
拋磚引玉
暴力迴圈 || 分組迴圈 -> 超時
/**
* @param {number[]} A
* @param {number[]} B
* @param {number[]} C
* @param {number[]} D
* @return {number}
*/
var fourSumCount = function(A, B, C, D) {
let N = A.length,
_result = 0,
listA = [],
listB = []
// A、B先成組匹配
for (let a = 0; a < N; a++) {
for (let b = 0; b < N; b++) listA.push(A[a] + B[b])
}
// C、D再成組匹配
for (let c = 0; c < N; c++) {
for (let d = 0; d < N; d++) listB.push(C[c] + D[d])
}
// 組合兩個組
for (let c = 0; c < listA.length; c++) {
for (let d = 0; d < listB.length; d++) {
if (listA[c] + listB[d] === 0) _result++
}
}
return _result
}
上面邏輯超時,那麼優化下分組的邏輯,在分組時,組內相同結果會在組合兩個組時重複計算,那麼使用雜湊來去重
/**
* @param {number[]} A
* @param {number[]} B
* @param {number[]} C
* @param {number[]} D
* @return {number}
*/
var fourSumCount = function(A, B, C, D) {
let N = A.length,
_result = 0,
map = new Map()
for (let a = 0; a < N; a++) {
for (let b = 0; b < N; b++) {
map.set(A[a] + B[b], (map.get(A[a] + B[b]) || 0) + 1)
}
}
for (let c = 0; c < N; c++) {
for (let d = 0; d < N; d++) {
if (map.has(-C[c] - D[d])) {
_result += map.get(-C[c] - D[d])
}
}
}
return _result
}
部落格: 前端小書童
每天的每日一題,寫的題解會同步更新到公眾號一天一大 lee 欄目
歡迎關注留言
相關文章
- 【一天一大 lee】N皇后 II (難度:困難) - Day20201017
- 454_四數相加Ii
- 【一天一大 lee】寶石與石頭 (難度:簡單) - Day20201002
- C++每日一練26-四數相加 IIC++
- 【10月打卡~Leetcode每日一題】18. 四數之和(難度:中等)LeetCode每日一題
- 力扣第29題 中等難度 兩數相除力扣
- Day 7| 454.四數相加II 、383. 贖金信 、15. 三數之和 、18. 四數之和
- 力扣第39題 組合總和 中等難度 卡了一天沒做出來力扣
- day7雜湊表 454.四數相加II |383. 贖金信|15. 三數之和 |18. 四數之和
- hduoj1002 A + B Problem II (大數相加 字串模擬)字串
- leetcode:462. 最少移動次數使陣列元素相等 II(數學,中等)LeetCode陣列
- Q30 LeetCode454 四數相加2LeetCode
- 503. 下一個更大元素 II(中等)
- 程式碼隨想錄演算法訓練營day07|454.四數相加II,383.贖金信,15.三數之和,18.四數之和演算法
- 程式碼隨想錄刷題day 7 | 雜湊表part02 454.四數相加II 383. 贖金信 15. 三數之和 18. 四數之和
- 兩數相加Ⅰ和Ⅱ
- Leetcode兩數相加LeetCode
- LeetCode——兩數相加LeetCode
- 用 PHP 在 力扣 刷演算法 [兩數相加]{一天一更}PHP力扣演算法
- 【1月打卡~Leetcode每日一題】86. 分隔連結串列(難度:中等)LeetCode每日一題
- LeetCode-兩數相加LeetCode
- 2. 兩數相加
- PHP字串數字相加PHP字串
- 【leetcode】【2、兩數相加】LeetCode
- LeetCode 2——兩數相加LeetCode
- 【LeetCode】2 兩數相加LeetCode
- 力扣1052. 愛生氣的書店老闆-C語言實現-中等難度力扣C語言
- 程式碼隨想錄演算法訓練營第七天|第454題.四數相加II,383. 贖金信,第15題. 三數之和演算法
- leetcode 2. 兩數相加LeetCode
- LeetCode 2.兩數相加LeetCode
- 演算法-兩數相加演算法
- 難度2:素數距離問題
- BraTs literature reading(Lee)
- LeetCode題集-2 - 兩數相加LeetCode
- 程式設計題-兩數相加程式設計
- LeetCode 第二題兩數相加LeetCode
- 神奇補0解決連結串列相加:LeeCode002兩數相加
- JAVA-LeetCode中等29兩數相除JavaLeetCode