力扣每日一题0616-532. 数组中的 k-diff 数对

129 阅读2分钟

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

给你一个整数数组 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) 。

哈希表

遍历数组,找出符合条件的数对。因为是寻找不同的数对,所以可以将数对放入哈希表 res\textit{res},完成去重的效果,最后返回哈希表的长度即可。遍历数组时,可以将遍历到的下标当作潜在的 jj,判断 jj 左侧是否有满足条件的 ii 来构成 k-diff 数对,而这一判断也可以通过提前将下标 jj 左侧的元素都放入另一个哈希表 visited\textit{visited} 来降低时间复杂度。如果可以构成,则将数对放入哈希表 res\textit{res}

代码实现时,由于 kk 是定值,知道数对的较小值,也就知道了另一个值,因此我们可以只将数对的较小值放入 res\textit{res},而不影响结果的正确性。判断完之后,再将当前元素放入 visited\textit{visited},作为后续判断潜在的 nums[i]\textit{nums}[i]

var findPairs = function(nums, k) {
    const visited = new Set();
    const res = new Set();
    for (const num of nums) {
        if (visited.has(num - k)) {
            res.add(num - k);
        }
        if (visited.has(num + k)) {
            res.add(num);
        }
        visited.add(num);
    }
    return res.size;
};