LeetCode | 454 4sum-II
分析
四个相同大小的数组,从数组中各取一个元素,四者之和要与目标值相等,target是一个确定值。在两数之和这给问题中,num[j] = target - num[i],在这道题目中是否也可以使用这种思维来降低自由变量数量?
将四个数组一分为2,两个数组作为一个整体,就可以等价于两数之和的思路了。取两个数组,计算出里面所有的元素之和,并按照值进行归类,有点类似于缓存的概念。有了确定的目标值,有了确定的缓存,求解剩余两个数组的互补元素组合。
四数之和与两数之和不同在于,前者只关注数值,后者还要关注索引,前者更自由一些,不需要返回满足条件的与之对应的数组索引下标。
主类
package com.github.dolphinmind.hash;
import java.util.HashMap;
import java.util.Map;
/**
* @author dolphinmind
* @ClassName FourSumII
* @description 四数相加
* @date 2024/8/9
*/
public class FourSumII {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int res = 0;
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// 统计两个数组中的元素之和,同时统计出现的次数,放入map中
for (int outer : nums1) {
for (int inner : nums2) {
int sum = outer + inner;
map.put(sum, map.getOrDefault(sum, 0)+1);
}
}
// 统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数
for (int outer : nums3) {
for (int inner : nums4) {
res += map.getOrDefault(0 - outer - inner, 0);
}
}
return res;
}
}