给定一个整数数组和一个整数 k,你需要在数组里找到 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。
这里将 k-diff 数对定义为一个整数对 (nums[i], nums[j]),并满足下述全部条件:
- 0 <= i < j < nums.length
- |nums[i] - nums[j]| == k
注意,|val| 表示 val 的绝对值。
样例输入:nums = [3, 1, 4, 1, 5], k = 2 输出:2 解释:数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。 尽管数组中有两个1,但我们只应返回不同的数对的数量。
提示:
- 1 <= nums.length <= 10^4
- -10^7 <= nums[i] <= 10^7
- 0 <= k <= 10^7
题目要求判断数组中有多少对不同的且差值为 k 的对数。
通过for循环暴力遍历肯定是会超时的,因为需要每两个数作比较。
所以我们使用map记录数据的出现次数,判断与当前数 x 差值为 k 的数是否出现,就可以找到对应数对。
我们先初始化 map
mapre; for(int i = 0; i < nums.size(); i++){ re[nums[i]]++; }
再通过迭代器遍历
int ans = 0;
map::iterator it;
for (it = re.begin(); it != re.end(); it++) {
int x = it->first;
if(re.count(x-k) && k != 0) ans ++;
else if(re.count(x-k) && re[x-k] > 1){
ans++;
}
}
这里只判断 x-k 是否存在,因为判断 k-x 是否存在会在之后 re[k-x] 判断重复计数一次。
这里还需要判断 k 是否为 0,因为 k = 0 的时候 re.count(x-k) 始终成立,但实际需要两个相同数才能组成对应数对,所以对此特判。
class Solution {
public:
int findPairs(vector& nums, int k) {
//初始化哈希表
map re;
sort(nums.begin(),nums.end());
for(int i = 0; i < nums.size(); i++){
re[nums[i]]++;
}
//遍历计数
int ans = 0;
map::iterator it;
for (it = re.begin(); it != re.end(); it++) {
int x = it->first;
if(re.count(x-k) && k != 0) ans ++;
else if(re.count(x-k) && re[x-k] > 1){
ans++;
}
}
return ans;
}
};
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/k-diff-pairs-in-an-array



