一、题目描述
☆☆☆☆二、解法
思路:将C+D的每一种可能放入查找表中,时间复杂度为O(n^2)。 由于可能有多组C+D的和相等,用Map记录每一个和出现了多少次。
举一反三:不是直接把数据放入查找表中,而是组合逻辑把特定的内容放入查找表中。还可以把A+B和C+D的每一种可能放入两个查找表中,时间复杂度依然是O(n^2)的。
class Solution { public int fourSumCount(int[] A, int[] B, int[] C, int[] D) { /** * 思路: 使用Map记录C+D的每一种可能,将时间复杂度由 O(n^4) 优化到 O(n^2) * 空间复杂度 O(n^2) */ Map<Integer,Integer> map = new HashMap<>(); for (int i = 0; i < C.length; i++) { for (int j = 0; j < D.length; j++) { map.put(C[i]+D[j], map.getOrDefault(C[i]+D[j], 0) + 1); } } int count = 0; for (int i = 0; i < A.length; i++) { for (int j = 0; j < B.length; j++) { int target = - (A[i] + B[j]); if (map.containsKey(target)) { count += map.get(target); } } } return count; } }