题目
给你一个 下标从 0 开始 的整数数组 nums ,返回满足下述条件的 不同 四元组 (a, b, c, d) 的 数目 :
nums[a] + nums[b] + nums[c] == nums[d] ,且
a < b < c < d
解题思路
数组长度只有50,直接四层循环暴力可以写,时间复杂度为O(
n
4
{n^4}
n4)。由于 nums[a] + nums[b] + nums[c]
可以直接得到 nums[d]
,那么可以用哈希表来查询 nums[d]
是否存在。这个题强制 a < b < c < d
,即 d
必须在最右边。反向枚举 c
,正向枚举 a
和 b
,那么 d
只能在 c
和 length
之间,在 c
移动的过程中更新 d
可能出现区间的哈希值,这样可以把时间复杂度降到O(
n
3
{n^3}
n3)。
代码
// 四层循环
class Solution {
public int countQuadruplets(int[] nums) {
int ans = 0, length = nums.length;
for (int i = 0; i < length; i++) {
for (int j = i + 1; j < length; j++) {
for (int k = j + 1; k < length; k++) {
for (int l = k + 1; l < length; l++) {
if (nums[i] + nums[j] + nums[k] == nums[l]) ans++;
}
}
}
}
return ans;
}
}
// 三层循环
class Solution {
public int countQuadruplets(int[] nums) {
int[] cnt = new int[450];
int ans = 0, length = nums.length;
for (int i = length - 2; i >= 2; i--) {
cnt[nums[i + 1]]++;
for (int j = 0; j < length; j++) {
for (int k = j + 1; k < i; k++) {
ans += cnt[nums[i] + nums[j] + nums[k]];
}
}
}
return ans;
}
}