持续创作,加速成长!这是我参与「掘金日新计划 · 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^70 <= k <= 10^7
二、思路分析:
还是同样的思路,根据题目的描述提取关键词,从关键词中在提取重要的信息最终选择合适的方法进行问题的解答。对于这道题目中,因为我们要找到不同的整数对,可以使得两数相减的绝对值等于k,且需要满足题目中的两个条件,这代表着:
- 我们不能够选择同样的数组元素,因为如果有重复元素的话那么选择的整数对也是相同的。
- 这里的顺序其实可以进行排序,但需要保证不会选取相同元素。 题目的基本步骤为:
- 先创建两个
set对象,保证不会出现重复值且通过set的API能够从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;
};
四、总结:
这道题需要注意到的是分类讨论,因为绝对值的存在我们需要进行分别判断;这道题也可以使用
排序+双指针的思路进行求解,思路大体相同,就是需要控制双指针的移动即可。