# LeetCode Medium 454. 4Sum II
tags: leetcode
問題
アイデア
整数列A
,B
,C
,D
が与えられるとき,それぞれの要素を1つずつ取り出してその総和が0となるようなものは何通り考えられるかを答えろという問題です.
ナイーブに解こうとすると$O(N4)$が必要ですが,連想配列を使うことで答えを記録すれば計算量を落とせそうです.
解法
A
とB
の要素の組み合わせを全探索し,その値をkeyとして,登場回数をvalueとする連想配列を作ります.- 次に
C
とD
の要素の組み合わせを全探索します.a + b + c + d
であれば,a + b = -c - d
であるので,C
とD
の要素の和を負にしたものを連想配列がkeyに持つならば,その登場回数を答えに加えれば良いです.
計算量
配列の最大長を$N$とします.
- 時間計算量
- $O(N2)$
- 空間計算量
- $O(N2)$
Python
class Solution: def fourSumCount(self, A: List[int], B: List[int], C: List[int], D: List[int]) -> int: complement_dic = {} res = 0 for a in A: for b in B : if a + b in complement_dic: complement_dic[a+b] += 1 else : complement_dic[a+b] = 1 for c in C : for d in D : if -c - d in complement_dic: res += complement_dic[-c-d] return res