给你一个 下标从 0 开始 的整数数组 nums ,返回满足下述条件的 不同 四元组 (a, b, c, d) 的 数目 :
nums[a] + nums[b] + nums[c] == nums[d] ,且 a < b < c < d
示例 1:
- 输入:nums = [1,2,3,6]
- 输出:1
- 解释:满足要求的唯一一个四元组是 (0, 1, 2, 3) 因为 1 + 2 + 3 == 6 。
示例 2:
- 输入:nums = [3,3,6,4,5]
- 输出:0
- 解释:[3,3,6,4,5] 中不存在满足要求的四元组。
示例 3:
- 输入:nums = [1,1,1,3,5]
- 输出:4
- 解释:满足要求的 4 个四元组如下:
- (0, 1, 2, 3): 1 + 1 + 1 == 3
- (0, 1, 3, 4): 1 + 1 + 3 == 5
- (0, 2, 3, 4): 1 + 1 + 3 == 5
- (1, 2, 3, 4): 1 + 1 + 3 == 5
提示:
- 4 <= nums.length <= 50
- 1 <= nums[i] <= 100
解题思路1-暴力破解
-
根据题目中的俩个条件
-
nums[a] + nums[b] + nums[c] == nums[d]
-
a < b < c < d
-
即可进行暴力破解代码如下
代码1-暴力破解
/**
* @param {number[]} nums
* @return {number}
*/
var countQuadruplets = function(nums) {
let len = nums.length
let ans = 0
if(len < 3) return ans
for(let a = 0; a < len; a++){
for(let b = a + 1; b < len; j++){
for(let c = b + 1; c < len; c++){
for(let d = c + 1; d < len;d++){
if (nums[a] + nums[b] + nums[c] == nums[d]) ans++;
}
}
}
}
return ans
};
解题思路2-Map(d)
- 在解题思路1的基础上可以以c为本根map出d的所有情况
- 可以看出d的取值范围(c < d < n)的
代码实现2
/**
* @param {number[]} nums
* @return {number}
*/
var countQuadruplets = function(nums) {
let len = nums.length
let ans = 0
if(len < 3) return ans
const map = new Map();
for (let c = len - 2; c >= 2; c--) {
map.set(nums[c + 1],map.get(nums[c + 1]) + 1 || 1)
for (let a = 0; a < c; a++) {
for (let b = a + 1; b < c; b++) {
ans += map.get(nums[a] + nums[b] + nums[c]) || 0;
}
}
}
return ans
};
解题思路3-Map(d-c)
- 将题目条件变形\
- nums[a] + nums[b] == nums[d] - nums[c]\
- 在解题思路2的基础上可以以b为本根map出d-c的所有情况\
- 可以看出d的取值范围(b + 2 < d < n)的
代码实现3
/**
* @param {number[]} nums
* @return {number}
*/
var countQuadruplets = function(nums) {
let len = nums.length
let ans = 0
if(len < 3) return ans
const map = new Map();
for (let b = len - 3; b >= 1; b--) {
for(let d = b + 2; d < len; d++){
map.set(nums[d] - nums[b + 1],map.get(nums[d] - nums[b + 1]) + 1 || 1)
}
for (let a = 0; a < b; a++) {
ans += map.get(nums[a] + nums[b]) || 0;
}
}
return ans
};