【发布时间】:2021-09-28 19:35:00
【问题描述】:
我正在解决 leetcode problem 上的一个问题 - Find K Closest Elements。
这是我的 IDE 代码:ide.geeksforgeeks
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
std::vector<int> findClosestElements(std::vector<int>& arr, int k, int x)
{
std::vector<int> res;
// min heap
std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>,
std::greater<std::pair<int, int>>> pq;
std::cout << "Debug queue : \n";
for (auto it : arr)
{
int closest = abs(it - x);
pq.push(std::make_pair(closest, it));
//std::cout << closest << " : " << it << "\n";
if (pq.size() > k)
{
pq.pop();
}
}
std::cout << "\nIterating queue : \n";
while(!pq.empty())
{
res.push_back(pq.top().second);
std::cout << pq.top().first << " : " << pq.top().second << "\n";
pq.pop();
}
std::sort(res.begin(), res.end());
return res;
}
int main()
{
std::vector<int> arr = {1,2,3,4,5};
auto res = findClosestElements(arr, 4, 3);
return 0;
}
当我迭代队列时,我看不到最小数量:0 : 3,它应该是 priority_queue 的顶部元素。谁能推荐一下?
【问题讨论】:
-
@Someprogrammerdude,你能简单介绍一下你的建议吗?
-
对不起,我错过了您使用第三个(可选)模板参数来反向排序。然后你还需要指定第二个。
-
如果将输出放回插入循环中,您的程序显示的输出是什么?它是否输出您期望它输出的内容?如果你打印
pq.size() > k时弹出的元素呢?它会弹出您的预期吗? -
这是 Leetcode 等网站的常见问题。它们只是一堆毫无意义的编程难题。那里没有 C++ 教程,也没有任何学习材料来解释解决这些难题所需的 C++ 基础知识。想学习 C++ 的人不会从他们的谜题中学到任何东西,而只能从一本好的 C++ 教科书中学到任何东西。这似乎是解决这个难题的完全错误的方法。此处正确的解决方案似乎只是 3-4 行代码:使用自定义比较器函数一次调用
sort()。 -
OT:
it在基于 for 循环的范围内命名令人困惑,因为它通常用于迭代器,但您的it不是迭代器
标签: c++ algorithm c++11 priority-queue