一、题目
二、题解
题目与两数之和类似,本题寻找的是相减绝对值等于k的元素,首先我们可以对数组进行排序,排序后对于每一个元素去寻找满足条件的k-diff对,在寻找时可以通过二分或者双指针寻找
class Solution {
public:
void qsort(vector<int>& arr, int l, int r) {
if (l > r) return;
srand(time(0));
int i = l, s = l - 1, e = r + 1, x = arr[rand() % ( r- l + 1) + l];
while (i < e) {
if (arr[i] > x) swap(arr[i], arr[--e]);
else if (arr[i] < x) swap(arr[i++], arr[++s]);
else i++;
}
qsort(arr, l, s), qsort(arr, e, r);
}
int findPairs(vector<int>& nums, int k) {
qsort(nums, 0, nums.size() - 1); // 排序
int cnt = 0;
for (int i = 0; i < nums.size() - 1; i++) { // 枚举每一个位置
if (i != 0 && nums[i] == nums[i - 1]) continue; // 去重
int l = i + 1, r = nums.size() - 1, target = nums[i] + k; //二分寻找target
while (l < r) {
int mid = l + (r - l) / 2;
if (nums[mid] >= target) r = mid;
else l = mid + 1;
}
if (nums[l] == target) cnt++;
}
return cnt;
}
};