给你四个整数数组 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以及出现次数
class Solution {
//1.hashmap 存储第一个数组的两数之和作为key(利用双层循环),两数之和出现的次数作为value
//2.第二个数组利用二重循环计算两数之和temp,在map中查找是否存在0-temp以及出现次数
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int res=0;
HashMap<Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums1.length;i++){
for(int j=0;j<nums1.length;j++){
int temp=nums1[i]+nums2[j];
map.put(temp,map.getOrDefault(temp,0)+1);
}
}
for(int i=0;i<nums1.length;i++){
for(int j=0;j<nums1.length;j++){
int temp=nums3[i]+nums4[j];
if(map.containsKey(-temp)){
res+=map.get(-temp);
}
}
}
return res;
}
}