开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情
一 描述
532. 数组中的 k-diff 数对 - 力扣(LeetCode)
给你一个整数数组 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
二 分析
现在看到这类题,会想到用双指针来做了。
首先排序,i和j分别指向第一和第二个元素(如果仅有一个元素根据题意返回0)
如果差大/小于k,移动较小/大的指针,直到指向的元素不同。
如果差等于k,更新计数,移动两个指针直至指向的元素都不同。
如果指向了同样的元素,后移较大指针。
三 答案
class Solution {
public:
int findPairs(vector<int>& nums, int k) {
if(nums.size() == 1) return 0;
sort(nums.begin(),nums.end());
int i = 0 , j = 1;
int count = 0;
while(j < nums.size()) {
if(nums[j] - nums[i] < k) {
++j;
while(j < nums.size() && nums[j] == nums[j-1]) ++j;
}
else if(nums[j] - nums[i] == k) {
++count;
++i;
++j;
while(i < nums.size() && nums[i] == nums[i-1]) ++i;
while(j < nums.size() && nums[j] == nums[j-1]) ++j;
}
else {
++i;
while(i < nums.size() && nums[i] == nums[i-1]) ++i;
}
if(i == j) ++j;
}
return count;
}
};
四 参考
532.数组中的k-diff数对 Python&Java 哈希表、双指针双解 - 数组中的 k-diff 数对 - 力扣(LeetCode)
双解数组中的k-diff数对:[哈希表] + [排序双指针] - 数组中的 k-diff 数对 - 力扣(LeetCode)