ๅฏไปฅๅปถ็ณๅฐk sum II๏ผๆถ้ดๅคๆๅบฆๆฏO(n^(k/2))๏ผๆ่ทฏๆฏๆๆฐ็ปไปฌๅๆไธคๅ๏ผ็ฎๅ่ช็sum็ๅฏ่ฝๆ ๅตๅๅบ็ฐ้ข็๏ผๅ็ปๅๅฐไธ่ตท
class Solution {
private int[][] allNums;
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
allNums = new int[][]{nums1, nums2, nums3, nums4};
Map<Integer, Integer> left = sumCount(0, 1);
Map<Integer, Integer> right = sumCount(2, 3);
int ans = 0;
for (int sum : left.keySet()) {
ans += left.get(sum) * right.getOrDefault(-sum, 0);
}
return ans;
}
private Map<Integer, Integer> sumCount(int start, int end) {
Map<Integer, Integer> cnt = new HashMap<>();
// ๅๅง็ถๆ๏ผไนๅไผๅ่ๅฃณไธๆ ทๆดๆฐ
cnt.put(0, 1);
for (int i = start; i <= end; i++) {
Map<Integer, Integer> tmpMap = new HashMap<>();
int[] array = allNums[i];
for (int total : cnt.keySet()) {
for (int num : array) {
int newTotal = total + num;
// ่ฎฐๅพๅ ไธไนๅๅทฒ็ปๆ็newTotal็ๆฐ้
tmpMap.put(newTotal, cnt.get(total) + tmpMap.getOrDefault(newTotal, 0));
}
}
cnt = tmpMap;
}
return cnt;
}
}