---
# System prepended metadata

title: 454. 4Sum II
tags: [Leetcode, medium, python, array, c++, hash]

---

###### tags: `Leetcode` `medium` `array` `hash` `python` `c++`

# 454. 4Sum II

## [題目連結:] https://leetcode.com/problems/4sum-ii/description/

## 題目:
Given four integer arrays ```nums1```, ```nums2```, ```nums3```, and ```nums4``` all of length n, return the number of tuples ```(i, j, k, l)``` such that:

* 0 <= i, j, k, l < n
* nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

**Example 1:**
```
Input: nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
Output: 2
Explanation:
The two tuples are:
1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
```
**Example 2:**
```
Input: nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
Output: 1
```

## 解題想法:
* 此題為在四個數組中各取一個數字，使其和為0
    * 若爆破法遍歷...time:O(n^4)
* 使用 [1. Two Sum](/9Oj4ypWESsCZdp4j3x_ssQ) 概念:
    * AB、CD兩兩數組一組->簡化為TWO SUM問題
    * time: O(n^2)
    * 使用hash map存
        * key: A、B數組之元素互相配對的不同總和
        * value:組合數量
    * 最後判斷C、D數組之元素互相配對取負號，是否出現於hash map中


## Python:
``` python=
from collections import defaultdict
class Solution(object):
    def fourSumCount(self, nums1, nums2, nums3, nums4):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :type nums3: List[int]
        :type nums4: List[int]
        :rtype: int
        """
        #AB CD兩兩一組->簡化為TWO SUM問題 O(n^2)
        dic=defaultdict(int) #key:總和 value:組合數量
        for i in nums1:
            for j in nums2:
                dic[i+j]+=1
        res=0
        for i in nums3:
            for j in nums4:
                if -(i+j) in dic:
                    res+=dic[-(i+j)]
        return res

nums1 = [1,2]
nums2 = [-2,-1]
nums3 = [-1,2]
nums4 = [0,2]

result=Solution()
ans=result.fourSumCount(nums1,nums2,nums3,nums4)
print(ans)
```

## C++:
``` cpp=
class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int, int> dic;
        for (int i: nums1){
            for (int j: nums2)
                dic[i+j]+=1;
        }
        int res=0;
        for (int i: nums3){
            for (int j: nums4){
                if (dic.find(-(i+j))!=dic.end())
                    res+=dic[-(i+j)];
            }
        }
        return res;
    }
};
```