c++实现,要求时间复杂度为O(N):我们有N个标记为[0, N-1]的石头,我们知道每个石头的重量,两个石头的重量可能相同。我们想要找到所有重量差为D的石头对。
时间: 2024-02-11 15:04:28 浏览: 80
实现一个时间复杂度为 O(N) 的算法,可以使用 unordered_set 来存储石头的重量,遍历每个石头,检查其前后是否存在重量差为D的石头。
具体实现如下:
```c++
#include <iostream>
#include <unordered_set>
using namespace std;
void findPairs(int stones[], int n, int d) {
unordered_set<int> s; // 存储石头的重量
for(int i = 0; i < n; i++) {
int stone = stones[i];
if(s.find(stone-d) != s.end()) { // 找到一个重量差为D的石头对
cout << "(" << stone << ", " << stone-d << ")" << endl;
}
if(s.find(stone+d) != s.end()) { // 找到一个重量差为D的石头对
cout << "(" << stone << ", " << stone+d << ")" << endl;
}
s.insert(stone); // 将该石头的重量插入到集合中
}
}
int main() {
int stones[] = {1, 3, 5, 6, 8};
int n = sizeof(stones) / sizeof(stones[0]);
int d = 3;
findPairs(stones, n, d);
return 0;
}
```
以上代码使用 unordered_set 存储石头的重量,遍历每个石头时,检查是否存在重量差为D的石头对,如果存在,则输出该石头对。同时,将该石头的重量插入到 unordered_set 中,方便后续的查找。由于 unordered_set 的查找和插入操作的时间复杂度都是 O(1),因此整个算法的时间复杂度为 O(N)。
阅读全文