给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
题解
看到形如:A+B…+N=0的式子,要转换为(A+…T)=-((T+1)…+N)再计算,这个T的分割点一般是一半,特殊情况下需要自行判断。定T是解题的关键。
此外,可以考虑用到哈希表
注意本题与Leetcode 18-四数之和有区别,18题是同一个数组,所以要用到两重双指针,而本题是四个数组,直接使用哈希表即可
题解可参考编程文青李狗蛋
-
hashmap 存储第一个数组的两数之和作为key(利用双层循环),两数之和出现的次数作为value
-
第二个数组利用二重循环计算两数之和temp,在map中查找是否存在0-temp以及出现次数
//两层for循环,map1记录nums1+nums2的全部值组合,O(ab)
//两层for循环,计算nums3+nums4的全部值组合,O(cd)
//在map1查找是否存在-(nums3[i]+nums[j])
//时间复杂度O(ab)+O(cd)
//两两组合是为了避免出现O(abc)+O(d)的时间复杂度
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
HashMap<Integer,Integer> map=new HashMap<>();
int res=0;
//不需要下标时这样写比较简洁
for(int i:nums1){
for(int j:nums2){
map.put(i+j,map.getOrDefault(i+j,0)+1);
}
}
for(int i:nums3){
for(int j:nums4){
if(map.containsKey(0-i-j)){
//不仅要判断有没有,还要判断出现次数
res+=map.getOrDefault(0-i-j,0);
}
}
}
return res;
}
}