【问题标题】:Understanding priority_queue by problem : Find K Closest Elements Solution按问题理解priority_queue:Find K Closest Elements 解决方案
【发布时间】: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() &gt; k时弹出的元素呢?它会弹出您的预期吗?
  • 这是 Leetcode 等网站的常见问题。它们只是一堆毫无意义的编程难题。那里没有 C++ 教程,也没有任何学习材料来解释解决这些难题所需的 C++ 基础知识。想学习 C++ 的人不会从他们的谜题中学到任何东西,而只能从一本好的 C++ 教科书中学到任何东西。这似乎是解决这个难题的完全错误的方法。此处正确的解决方案似乎只是 3-4 行代码:使用自定义比较器函数一次调用 sort()
  • OT: it 在基于 for 循环的范围内命名令人困惑,因为它通常用于迭代器,但您的 it 不是迭代器

标签: c++ algorithm c++11 priority-queue


【解决方案1】:

最大堆解决了这个问题。

vector<int> findClosestElements(vector<int>& arr, int k, int x) 
{
    std::vector<int> res;
    std::priority_queue<std::pair<int, int>> pq;

    for (auto it : arr)
    {
        int closest = abs(it - x);
        //std::cout << closest << " : " << it << "\n";
        pq.push(std::make_pair(closest, it));

        if (pq.size() > k)
        {
            pq.pop();     
        }
    }

    //std::cout << "\nDebug 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2021-08-19
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多