给定N个整数A[i]以及一个正整数C,请设计时间复杂度为O(Nlg N)的算法,求其中有多少对i, j满足 A[i]-A[j]=C。 输入格式: 第一行输入两个空格隔开的整数N和C, 第二到第N+1行每一行包含一个整数Ai.用c++实现
时间: 2024-12-06 17:26:54 浏览: 25
这个问题可以使用哈希集合(unordered_set)结合排序的思想来解决。以下是C++的一种解决方案:
```cpp
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int countPairsWithDiffK(vector<int>& nums, int C) {
sort(nums.begin(), nums.end()); // 先对数组进行排序
unordered_set<int> hashSet;
int count = 0; // 记录满足条件的对数
for (int i = 0; i < nums.size(); ++i) {
int complement = C - nums[i]; // 求解目标值
if (hashSet.find(complement) != hashSet.end()) { // 如果找到了差值对应的元素
count++;
}
// 添加当前元素到哈希集中
hashSet.insert(nums[i]);
}
return count;
}
int main() {
int N, C;
cin >> N >> C;
vector<int> nums(N);
for (int i = 0; i < N; ++i) {
cin >> nums[i];
}
cout << "Number of pairs with difference " << C << ": " << countPairsWithDiffK(nums, C) << endl;
return 0;
}
```
这个算法首先对数组进行排序,然后遍历数组,对于每个元素,我们在哈希集合中查找它的补数(C - A[i]),如果找到就增加计数。同时,我们将当前元素添加到哈希集中。由于哈希查询的时间复杂度为O(1),整体时间复杂度为O(N * logN),因为我们只对整个数组进行了一次排序。
阅读全文