思路
思路一:暴力破解。
将数组两两求和。但是会超时。
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int[] res1 = sum(nums1,nums2);
int[] res2 = sum(nums3,nums4);
int l1 = res1.length;
int l2 = res2.length;
int res=0;
for(int i =0 ;i<l1;i++){
for(int j = 0;j<l2;j++){
if(res1[i]+res2[j] == 0)
res++;
}
}
return res;
}
public int[] sum(int[] nums1, int[] nums2){
int l1 = nums1.length;
int l2 = nums2.length;
int[] res = new int[l1*l2];
int index = 0;
for(int i =0 ;i<l1;i++){
for(int j = 0;j<l2;j++){
res[index] = nums1[i]+nums2[j];
index++;
}
}
return res;
}
}
思路二:用哈希表
哈希表可以将两个数组中的和的重复出现的结果保存在哈希表中,可以降低时间复杂度。
将前两个数组中元素的和用map存储,map的key是和,值为1,如果key重复出现就将value++;
0-后两个数组的和得到的就是前两个数组的和,也就是map的key,取对应的value就可以了。
代码
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer,Integer>map = new HashMap<>();
int res = 0;
for(int i =0;i<nums1.length;i++){
for(int j =0;j<nums2.length;j++){
int temp = nums1[i]+nums2[j];
if(map.containsKey(temp)){
map.put(temp, map.get(temp) + 1);
}else{
map.put(temp,1);
}
}
}
//统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数
for (int i : nums3) {
for (int j : nums4) {
int temp = i + j;
if (map.containsKey(0 - temp)) {
res += map.get(0 - temp);
}
}
}
return res;
}
}
|