c++实现,要求时间复杂度为O(N):我们有N个标记为[0, N-1]的石头,我们知道每个石头的重量,石头重量可能会相同。我们想要找到所有重量差为D的石头对。
时间: 2024-02-11 21:04:30 浏览: 67
同样可以使用 unordered_set 来实现时间复杂度为 O(N) 的算法,不过这里需要将石头的重量和下标组成一个 pair,存储到 unordered_set 中。遍历每个石头时,检查其前后是否存在重量差为D的石头对。
具体实现如下:
```c++
#include <iostream>
#include <unordered_set>
using namespace std;
void findPairs(int stones[], int n, int d) {
unordered_set<pair<int, int>> s; // 存储石头的重量和下标
for(int i = 0; i < n; i++) {
int stone = stones[i];
if(s.find({stone-d, i}) != s.end()) { // 找到一个重量差为D的石头对
cout << "(" << stone << ", " << stone-d << ")" << endl;
}
if(s.find({stone+d, i}) != s.end()) { // 找到一个重量差为D的石头对
cout << "(" << stone << ", " << stone+d << ")" << endl;
}
s.insert({stone, i}); // 将该石头的重量和下标插入到集合中
}
}
int main() {
int stones[] = {1, 3, 5, 6, 8, 5};
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)。
阅读全文