【python&&Java】leetcode.454.四数相加Ⅱ 解法思路
题目要求(链接https://leetcode.cn/problems/4sum-ii/)
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
- 0 <= i, j, k, l < n
- nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
解法思路
利用"哈希表"来解决,可以将该问题逻辑转换成小学数学问题 (x+y) = -(z+w)
具体代码
Java
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int res = 0;//计算的目标值为0
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i: nums1){
for(int j: nums2){
int sum = i + j;
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
}
for(int i: nums3){
for(int j: nums4){
res += map.getOrDefault(0 - i - j, 0);
}
}
return res;
}
}
注意:map.getOrDefalut是 java.util.Map 接口上的一个 Java 8+ default 方法:
// 接口声明
default V getOrDefault(Object key, V defaultValue)
// JDK 17 的 javap 实测输出:
// Map : public default V getOrDefault(java.lang.Object, V);
// HashMap : public V getOrDefault(java.lang.Object, V); ← HashMap 重写了它
python3
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
cnt = Counter(x+y for x in nums1 for y in nums2)
return sum(cnt[-(z+w)] for z in nums3 for w in nums4)
211



被折叠的 条评论
为什么被折叠?



