「LeetCode」532-数组中的 k-diff 数对

102 阅读1分钟

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

一.题目:

532. 数组中的 k-diff 数对 给定一个整数数组和一个整数 k,你需要在数组里找到 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。

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

  • 0 <= i < j < nums.length
  • |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. 我们不能够选择同样的数组元素,因为如果有重复元素的话那么选择的整数对也是相同的。
  2. 这里的顺序其实可以进行排序,但需要保证不会选取相同元素。 题目的基本步骤为:
  • 先创建两个set对象,保证不会出现重复值且通过setAPI能够从set集合里找到符合条件的数组元素。
  • 注意到两数相减的绝对值等于k就能够满足需求,所以我们需要进行分类讨论,一种是选择的元素减去k第二种是选择的元素加上k,只要有元素满足其中一个条件都能够放入结果集合中去,最终的结果就是结果集合的大小。

三、代码:

function findPairs(nums: number[], k: number): number {
    let res = new Set();
    let tempNums = new Set();
    for(const num of nums){
        //需要考虑到绝对值
        if(tempNums.has(num - k)){
            res.add(num - k);
        }
        if(tempNums.has(num + k)){
            res.add(num);
        }
        tempNums.add(num);
    }
    return res.size;
};

四、总结:

这道题需要注意到的是分类讨论,因为绝对值的存在我们需要进行分别判断;这道题也可以使用排序+双指针的思路进行求解,思路大体相同,就是需要控制双指针的移动即可。