原题链接:532. 数组中的 k-diff 数对
solution:
暴力法,时间复杂度O(n^2),也可以过
class Solution {
public:
int findPairs(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
int res = 0; //定义返回值
int n = nums.size();
for(int i = 0;i < n;i++) {
if(i > 0 && nums[i] == nums[i - 1]) continue; //去重
for(int j = i + 1;j < n;j++) {
if(j > i + 1 && nums[j] == nums[j - 1]) continue; //去重
if(nums[j] - nums[i] == k) {
res++;
}
}
}
return res;
}
};
二分查找:
① 先将数组元素进行排序
② 排完序后,遍历数组元素nums[i],对每一个nums[i]进行二分查找nums[i] + k的数,
class Solution {
public:
int findPairs(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
if(k < 0) return 0;
int res = 0; //返回值
int n = nums.size();
for(int i = 0;i < n;i++) {
if(i > 0 && nums[i] == nums[i - 1]) continue; //去重
int l = i + 1,r = n - 1;
int target = nums[i] + k; //排序完后面的数字一定比前面的大
while(l < r) {
int mid = l + (r - l) / 2;
if(nums[mid] >= target) r = mid;
else l = mid + 1;
}
if(l < n && nums[l] == target) res++;
}
return res;
}
};