题目链接
解题思路
- 将数组分成两组,HashMap存一组,另一组和HashMap进行比对
- 这种,可以分为三种情况
- 0+4模式,时间复杂度为
O(n^4)
- 1+3模式,时间复杂度
O(n) + O(n^3) = O(n^3)
- 2 +2模式,时间复杂度
O(n^2) + O(n^2) = O(n^2)
- 显然我们选择2+2模式。以AB为一组,先使用二重循环遍历,并将所有的
A[i] + B[j]
的值和它的出现次数存入HashMap中,对于CD,同样使用二重循环进行遍历,当遍历到C[i] + D[j]
时,如果-(C[i] + D[j])
出现在HashMap
中,那么就+1。
AC代码
class Solution {
public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
Map<Integer, Integer> map = new HashMap<>();
int ans = 0;
for (int item : A) {
for (int value : B) {
int sum_AB = item + value;
if (map.containsKey(sum_AB))
map.put(sum_AB, map.get(sum_AB) + 1);
else
map.put(sum_AB, 1);
}
}
for (int item : C) {
for (int value : D) {
int sum_CD = -(item + value);
if (map.containsKey(sum_CD))
ans += map.get(sum_CD);
}
}
return ans;
}
}
本地测试代码
package com.company;
import java.util.HashMap;
import java.util.Map;
public class Solution_454 {
public static int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
Map<Integer, Integer> map = new HashMap<>();
int ans = 0;
for (int item : A) {
for (int value : B) {
int sum_AB = item + value;
if (map.containsKey(sum_AB))
map.put(sum_AB, map.get(sum_AB) + 1);
else
map.put(sum_AB, 1);
}
}
for (int item : C) {
for (int value : D) {
int sum_CD = -(item + value);
if (map.containsKey(sum_CD))
ans += map.get(sum_CD);
}
}
return ans;
}
public static void main(String[] args) {
System.out.println(fourSumCount(new int[]{1, 2}, new int[]{-2, -1}, new int[]{-1, 2}, new int[]{0, 2}));
}
}