[路飞]_leetcode 1995. 统计特殊四元组

257 阅读1分钟

题目来源:leetcode 、1995. 统计特殊四元组

给你一个 下标从 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
};