532. 数组中的 k-diff 数对
2024.9.12
题目
给你一个整数数组 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.length <= 104
-107 <= nums[i] <= 107
0 <= k <= 107
示例
示例 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.对数对的理解有错误:
- 需要从
数学角度考虑数对
,就简单易懂了
2.如果不用考虑k = 0
,那么不需要用hashmap
,如下:
class Solution {
public:
int findPairs(vector<int>& nums, int k) {
int total = 0;
unordered_set<int> hashset;
for(const auto& num:nums){
hashset.insert(num);
}
for(const auto& num:hashset){
if(hashset.count(num-k)){
total++;
}
}
return total;
}
};
3.但是考虑了k = 0
,那么就用map的键值对的值去存数出现的次数
4.可以再看看hashmap
的C++的语法,如下,仔细看
class Solution {
public:
int findPairs(vector<int>& nums, int k) {
int total = 0;
unordered_map<int,int> hashmap;
for(const auto& num:nums){
hashmap[num]++;
}
for(const auto& pair:hashmap){
if(k == 0){
total += (pair.second >= 2);// 特判k=0时的情况,需要看一个数是否出现至少两次
}else{
total += (hashmap.count(pair.first - k));
}
}
return total;
}
};