leetcode刷题记录-2006. 差的绝对值为 K 的数对数目

159 阅读2分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看: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
输出:3
解释:差的绝对值为 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

题解

暴力解法

最简单的暴力解法,双重循环遍历整个数组,将每一个数一对一拿出来判断相减的绝对值会不会等于 k:

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

image.png

利用哈希表优化时间复杂度到 O(n) - 一次遍历

我们可以转化一下思路,不是去找两个相相减绝对值等于 k 的数,而是在遍历到一个数的时候,我们可以去找一下,它和谁相减的绝对值会等于 k,然后将每次遍历到的数存入一个哈希表,这样在之后碰到满足条件的数,就可以来表中查找到它的个数,然后就只需要设置一个 ans 将所有满足情况的次数相加起来就ok了:

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

image.png