leetcode 題目454. 四數相加 II

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章