题目:
给你四个整数数组 nums1
、nums2
、nums3
和 nums4
,数组长度都是 n
,请你计算有多少个元组 (i, j, k, l)
能满足:
- 0 < = i , j , k , l < n 0 <= i, j, k, l < n 0<=i,j,k,l<n
- n u m s 1 [ i ] + n u m s 2 [ j ] + n u m s 3 [ k ] + n u m s 4 [ l ] = = 0 nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0 nums1[i]+nums2[j]+nums3[k]+nums4[l]==0
示例:
- 输入: n u m s 1 = [ 1 , 2 ] , n u m s 2 = [ − 2 , − 1 ] , n u m s 3 = [ − 1 , 2 ] , n u m s 4 = [ 0 , 2 ] nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2] nums1=[1,2],nums2=[−2,−1],nums3=[−1,2],nums4=[0,2]
- 输出: 2 2 2
- 解释: 两个元组如下:
- ( 0 , 0 , 0 , 1 ) − > n u m s 1 [ 0 ] + n u m s 2 [ 0 ] + n u m s 3 [ 0 ] + n u m s 4 [ 1 ] = 1 + ( − 2 ) + ( − 1 ) + 2 = 0 (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0 (0,0,0,1)−>nums1[0]+nums2[0]+nums3[0]+nums4[1]=1+(−2)+(−1)+2=0
- ( 1 , 1 , 0 , 0 ) − > n u m s 1 [ 1 ] + n u m s 2 [ 1 ] + n u m s 3 [ 0 ] + n u m s 4 [ 0 ] = 2 + ( − 1 ) + ( − 1 ) + 0 = 0 (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0 (1,1,0,0)−>nums1[1]+nums2[1]+nums3[0]+nums4[0]=2+(−1)+(−1)+0=0
解题思路:
定义一个哈希表,然后遍历nums1
和nums2
,用哈希表记录a+b
出现的次数,再遍历nums3
和nums4
,若有0-(c+d)
出现,则加到结果中。
版本一:Java
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int res = 0;
Map<Integer, Integer> hash = new HashMap<Integer, Integer>();
for(int a : nums1)
for(int b : nums2){
int sum = a + b;
hash.put(sum, hash.getOrDefault(sum, 0) + 1);
}
for(int c : nums3)
for(int d : nums4)
res += hash.getOrDefault(0 - c - d, 0);
return res;
}
}
版本二:C++
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> hash;
for(int a : nums1)
for(int b : nums2)
hash[a + b] ++;
int res = 0;
for(int c : nums3)
for(int d : nums4)
if(hash.find(0 - (c + d)) != hash.end())
res += hash[0 - (c + d)];
return res;
}
};
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度:
O
(
n
2
)
O(n^2)
O(n2)