classSolution{ /** * 哈希表 */ // 本题中看似是四个数的查找,其实我们将等式移动一下不难发现 // a + b = d - c // 这样我们就可以利用哈希表从后向前记录 d - c 的可能 // 同时利用 b 当中轴,如何向前遍历 a // 这样原来的四重 for 循环就变成双重循环了 publicintcountQuadruplets(int[] nums){ HashMap<Integer, Integer> map = new HashMap<>(); int n = nums.length; int result = 0;
// 此处将 b 作为中轴向前寻找 a,向后寻找 d - c for (int b = n - 3; b >= 1; b--) { int temp; for (int d = b + 2; d < n; d++) { temp = nums[d] - nums[b + 1]; map.put(temp, map.getOrDefault(temp, 0) + 1); } for (int a = 0; a < b; a++) { temp = nums[a] + nums[b]; result += map.getOrDefault(temp, 0); } }