解题思路:
(1)先使用优先队列排序
(2)再通过相邻比较,其中依据递增性,记录每次nums[j]-nums[i]>k的位置,这作为下次j的初始位置
(3)i的位置是代表不同的数
class Solution {
public:
int findPairs(vector<int>& nums, int k) {
if (k<0||nums.size()<=1) return 0;
auto comp = [&](const int &a, const int &b) {
return a>b;
};
priority_queue<int,vector<int>,decltype(comp)> pq(nums.begin(),nums.end(),comp);
vector<int> v; //存储排好序的数组
while(!pq.empty()) {
v.push_back(pq.top());
pq.pop();
}
int i = 0,j = 0,last = 0,count = 0,prev = 0;
while(i<v.size()) {
prev = v[i];
j = (last==i)?(i+1):last;
while(j<v.size()) {
if (v[j]-v[i]<k) {
j++;
} else {
if (v[j]-v[i]>k) {
last = j;
break;
} else {
count++;
while(j<v.size() && v[j]-v[i]==k) {
j++;
}
last = j;
break;
}
}
}
i++;
while(i<v.size() && prev==v[i]) {
i++;
}
}
return count;
}
};