2020/3/25 打卡
題目
給定四個包含整數的數組列表 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 解釋: 兩個元組如下: 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
思路
這題題意非常簡單,就是分別從 ABCD四個數組中分別取出四個數,使得 四個數加在一起值爲0,然後判斷共有多少組數可以實現這樣的效果。 思路也比較簡單吧,因爲最後的目標和是0,所以只需要 找到兩兩和爲0就行,舉個例子就比如 A+B = -(C+D)。因此可以使用字典的方式,先去統計A+B可能出現和的情況,將A+B存到字典中作爲鍵,將該A+B和值的出現次數作爲 值,存儲在字典中去。【這裏將出現次數作爲值是因爲我們的目標是統計有多少組。】接下來 我們再對C 和D的和情況進行搜索,找到滿足 -(C+D)存在原先的字典中,就說明滿足和爲0的條件了,將鍵值作爲滿足的個數即可。
具體實現: (1)遍歷 A 和 B 所有元素和的組合情況,並記錄在 ab_map 中,ab_map 的 key 爲兩數和,value 爲該兩數和出現的次數 (2)遍歷 C 和 D 所有元素和的組合情況,取和的負值判斷其是否在 ab_map 中,若存在則取出 ab_map 對應的 value 值,count = count + value
代碼
class Solution(object):
def fourSumCount(self, A, B, C, D):
"""
:type A: List[int]
:type B: List[int]
:type C: List[int]
:type D: List[int]
:rtype: int
"""
# 出現創建 字典和 滿足條件元組數量
count = 0
ab_map = dict()
# 針對A+B 的和進行統計,並存放在字典中, 字典的鍵就是a+b的值,值就是這樣的a+b值出現的次數。
for a in A:
for b in B:
ab_map[a + b] = ab_map.get(a + b, 0) + 1
# 進一步 的我們的 C+D的和 進行搜索,找到滿足 能夠跟 已經存在的A+B情況能和爲0的情況的個數。
for c in C:
for d in D:
s = -(c + d)
# 找到了 滿足的情況,統計滿足和情況 出現的次數即可。
if s in ab_map:
count += ab_map[s]
# 最後的count就是累計的結果。
return count