[路飞]_leetcode 2006. 差的绝对值为 K 的数对数目

194 阅读2分钟

「这是我参与2022首次更文挑战的第23,活动详情查看:2022首次更文挑战

2006. 差的绝对值为 K 的数对数目

给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k 。

|x| 的值定义为:

如果 x >= 0 ,那么值为 x 。 如果 x < 0 ,那么值为 -x 。  

示例 1:

输入:nums = [1,2,2,1], k = 1
输出:4
解释:差的绝对值为 1 的数对为:
[1,2,2,1]
[1,2,2,1]
[1,2,2,1]
[1,2,2,1]

示例 2:

输入:nums = [1,3], k = 3
输出:0
解释:没有任何数对差的绝对值为 3 。

示例 3:

输入:nums = [3,2,1,5,4], k = 2
输出:
解释:差的绝对值为 2 的数对为:
[3,2,1,5,4]
[3,2,1,5,4]
[3,2,1,5,4]  

提示:

1 <= nums.length <= 200
1 <= nums[i] <= 100
1 <= k <= 99

分析

从提示来看1 <= nums.length <= 200数组长度较短;1 <= nums[i] <= 100数值为100以内;我们需要从数组nums中找出差值的绝对值为k。值得一说的是我们可以通过Math.abs来求绝对值,下面我们用俩中方法来实现。

1.逐步实现 俩层循环暴力解法

最简单的方法就是通过俩层循环来解决,首先我们先定义ans用于存放差值的绝对值为k的数量。

let ans = 0

通过俩层循环,第二层循环的起始索引需要比第层大1,这样我们就能得到俩个数通过Math.abs就能求出绝对值是否大于k。

for (let i = 0; i < nums.length; i++) {
        for (let j = i + 1; j < nums.length; j++) {
           if (Math.abs(nums[i] - nums[j]) == k) {
                ans++;
            }
        }
    }

1.完整代码 俩层循环暴力解法

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var countKDifference = function(nums, k) {
    let ans = 0
    for (let i = 0; i < nums.length; i++) {
        for (let j = i + 1; j < nums.length; j++) {
            if (Math.abs(nums[i] - nums[j]) == k) {
                ans++;
            }
        }
    }
    return ans;
};

2.逐步实现 map + 一次遍历

首先定义map用于存放当前数值出现的次数,定义ans用于存放符合结果的个数。

let ans = 0
const map = new Map();

通过循环当map对象存在当前值减k或者当前值加k这俩种情况的值是那就使ans加上此值出现的个数,当前每次循环也需要去统计当前值出现的个数。

 for (let i = 0; i < nums.length; i++) {
        ans = ans + (map.get(nums[i] - k) || 0) 
        ans = ans + (map.get(nums[i] + k) || 0)
        map.set(nums[i], (map.get(nums[i]) || 0) + 1);
    }

2.完整代码 map + 一次遍历

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */

var countKDifference = function(nums, k) {
    let ans = 0
    const map = new Map();
    for (let i = 0; i < nums.length; i++) {
        ans = ans + (map.get(nums[i] - k) || 0) 
        ans = ans + (map.get(nums[i] + k) || 0)
        map.set(nums[i], (map.get(nums[i]) || 0) + 1);
    }
    return ans;
};