数组中的 k-diff 数对

94 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

说在前面

🎈每天进行一道算法题目练习,今天的题目是“数组中的 k-diff 数对”。

问题描述

给你一个整数数组 nums 和一个整数 k,请你在数组中找出 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。

k-diff 数对定义为一个整数对 (nums[i], nums[j]) ,并满足下述全部条件:

0 <= i, j < nums.length
i != j
nums[i] - nums[j] == k
注意,|val| 表示 val 的绝对值。

示例 1:

输入:nums = [3, 1, 4, 1, 5], k = 2
输出:2
解释:数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
尽管数组中有两个 1 ,但我们只应返回不同的数对的数量。

示例 2:

输入:nums = [1, 2, 3, 4, 5], k = 1
输出:4
解释:数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5) 。

示例 3:

输入:nums = [1, 3, 1, 5, 4], k = 0
输出:1
解释:数组中只有一个 0-diff 数对,(1, 1) 。

提示:

1 <= nums.length <= 10^4
-10^7 <= nums[i] <= 10^7
0 <= k <= 10^7

思路分析

题目描述很简单,就是要我们在给出数组中计算出有多少对差为k的数对,数对需要满足以下条件:

  • 1、两数之差为k;
  • 2、数对不能重复;
  • 3、数对需要是下标不同的两个数。 知道了上面这三个限制之后,我们也就可以开始解题了:
    nums[i] - nums[j] == k这个公式我们可以得出:nums[i] == k + nums[j]
    想要数对不重复,我们只需要保证nums[i]不重复即可,所以我们可以遍历一遍数组得出答案,具体如下:
  • 1、使用hash表记录元素出现次数及是否出现过; 使用hash表记录元素出现次数,如果当前数字已经被当做nums[i]用过了,那么将其标记为false,下次遇到就可以直接跳过了。统计元素出现的次数,如果k=0是,则说明我们需要找到两个下标不同的相同元素,所以我们需要判断元素个数是否大于2。
let map = {};
for(let i = 0; i < nums.length; i++){
    if(map[nums[i]] == false) continue;
    map[nums[i]] = (map[nums[i]] || 0) + 1;
    if(k == 0 && map[nums[i]] < 2) continue;
    ……
    ……
}
  • 2、判断当前元素是否可以作为公式中的nums[i]; 由nums[i] - nums[j] == k这个公式我们可以得出:nums[i] == k + nums[j],我们只需要判断数组中是否有k + nums[j]元素出现即可。
if(map[nums[i] + k]){
    res++
    map[nums[i] + k] = false;
}
  • 3、判断当前元素是否可以作为公式中的nums[j]。 由nums[i] - nums[j] == k这个公式我们可以得出:nums[j]== nums[i] - k,我们只需要判断数组中是否有nums[i] - k元素出现即可。
if(map[nums[i] - k] != undefined){
    res++;
    map[nums[i]] = false;
}

AC代码

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
 var findPairs = function(nums, k) {
    let map = {};
    let res = 0;
    for(let i = 0; i < nums.length; i++){
        if(map[nums[i]] == false) continue;
        map[nums[i]] = (map[nums[i]] || 0) + 1;
        if(k == 0 && map[nums[i]] < 2) continue;
        if(map[nums[i] - k] != undefined){
            res++;
            map[nums[i]] = false;
        }
        if(map[nums[i] + k]){
            res++
            map[nums[i] + k] = false;
        }
    }
    return res;
};

说在后面

🎉这里是JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。