532. 数组中的 k-diff 数对
思路:方法一,排序+双指针+哈希表。时间复杂度0(nlogn)
class Solution {
public:
int findPairs(vector<int>& nums, int k) {
//排好序后,就可以解决绝对值的处理
sort(nums.begin(),nums.end());
//通过集合来进行去重操作
set<pair<int,int>> st;
//j是双指针的左边
int j=0;
//i是双指针的右边
for(int i=1;i<nums.size();i++){
//当差距大于k时,就移动双指针j
while(j<i&&nums[i]-nums[j]>k) j++;
if(j!=i&&nums[i]-nums[j]==k){
st.insert({nums[j],nums[i]});
}
}
return st.size();
}
};
思路:方法二,遍历+哈希表。时间复杂度0(n)
class Solution {
public:
int findPairs(vector<int>& nums, int k) {
//保存已经遍历过的数
unordered_set<int> vis;
//保存数对的左边
unordered_set<int> st;
//开始遍历
for(int i=0;i<nums.size();i++){
if(vis.count(nums[i]-k)){
//保存数对左边的数
st.insert(nums[i]-k);
}
if(vis.count(nums[i]+k)){
st.insert(nums[i]);
}
vis.insert(nums[i]);
}
return st.size();
}
};