692.前k个高频单词(堆&优先队列)

链接:692. 前K个高频单词 - 力扣(LeetCode)

题解:

push进入que中,不能只比较count,还需要比较字符串字典序列,所以要用node类型进行比较

cpp 复制代码
class Solution {
public:
    struct Node {
        Node(string s, int c) {
            word = s;
            count = c;
        }
        bool operator<(const Node& n) const {
            if (count > n.count) { // 约大的在下面
                return true;
            } else if (count == n.count &&
                       word < n.word) { // 字典许约小的在下面
                return true;
            }
            return false;
        }
        int count;
        string word;
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        unordered_map<string, int> table;
        for (auto& w : words) {
            ++table[w];
        }
        priority_queue<Node, vector<Node>> que;
        for (auto& e : table) {
            Node node(e.first, e.second);
            if (que.size() < k) {
                que.push(node);
            } else if (!que.empty() && node < que.top() ) {
                que.pop();
                que.push(node);
            }
            /*if (que.size() >= k) {
                Node node(e.first, e.second);
                que.push(node); // 先压入在弹出
                que.pop();

            } else {
                Node node(e.first, e.second);
                que.push(node);
            }*/
        }
        vector<string> result;
        result.resize(k);
        for (int i = k - 1; i >= 0; --i) {
            result[i] = que.top().word;
            que.pop();
        }
        /*result.reserve(k);
        while (!que.empty()) {
            result.push_back(que.top().word);
            que.pop();
        }*/
        //reverse(result.begin(), result.end());
        return result;
    }
};
cpp 复制代码
class Solution {
public:
    struct Node {
        Node(string s, int c) {
            word = s;
            count = c;
        }
        bool operator<(const Node& n) const {
            if (count > n.count) { // 约大的在下面
                return true;
            } else if (count == n.count &&
                       word < n.word) { // 字典许约小的在下面
                return true;
            }
            return false;
        }
        int count;
        string word;
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        unordered_map<string, int> table;
        for (auto& w : words) {
            ++table[w];
        }
        priority_queue<Node, vector<Node>> que;
        for (auto& e : table) {
            Node node(e.first, e.second);
            que.push(node);
            if (que.size() > k) {
                que.pop();
            }
            /*if (que.size() >= k) {
                Node node(e.first, e.second);
                que.push(node); // 先压入在弹出
                que.pop();

            } else {
                Node node(e.first, e.second);
                que.push(node);
            }*/
        }
        vector<string> result;
        result.resize(k);
        for (int i = k - 1; i >= 0; --i) {
            result[i] = que.top().word;
            que.pop();
        }
        /*result.reserve(k);
        while (!que.empty()) {
            result.push_back(que.top().word);
            que.pop();
        }*/
        //reverse(result.begin(), result.end());
        return result;
    }
};
cpp 复制代码
class Solution {
public:
    struct Node {
        Node(string s, int c) {
            word = s;
            count = c;
        }
        bool operator<(const Node& n) const {
            if (count > n.count) {// 约大的在下面
                return true;
            } else if (count == n.count && word < n.word) { // 字典许约小的在下面
                return true;
            }
            return false;
        }
        int count;
        string word;
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        unordered_map<string, int> table;
        for (auto& w : words) {
            ++table[w];
        }
        priority_queue<Node> que;
        for (auto& e : table) {
            if (que.size() >= k) {
                Node node(e.first, e.second);
                que.push(node); // 先压入在弹出
                que.pop();

            } else {
                Node node(e.first, e.second);
                que.push(node);
            }
        }
        vector<string> result;
        result.reserve(k);
        while (!que.empty()) {
            result.push_back(que.top().word);
            que.pop();
        }
        reverse(result.begin(), result.end());
        return result;
    }
};
cpp 复制代码
class Solution {
public:
    vector<string> topKFrequent(vector<string>& words, int k) {
        unordered_map<string, int> cnt;
        for (auto& word : words) {
            cnt[word]++;
        }
        auto cmp = [](const pair<string, int>& a, const pair<string, int>& b) {
            return a.second == b.second ? a.first < b.first : a.second > b.second;
        };
        priority_queue<pair<string, int>, vector<pair<string, int>>, decltype(cmp)> que(cmp);
        for (auto& it : cnt) {
            que.emplace(it);
            if (que.size() > k) {
                que.pop();
            }
        }
        vector<string> ret(k);
        for (int i = k - 1; i >= 0; i--) {
            ret[i] = que.top().first;
            que.pop();
        }
        return ret;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/top-k-frequent-words/solutions/785903/qian-kge-gao-pin-dan-ci-by-leetcode-solu-3qk0/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关推荐
xailorliu2 小时前
SLIC_超像素算法
c++·opencv·目标检测·机器学习·计算机视觉
苏打豆2 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
蛋蛋的就会顺顺的2 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
小小龙学IT3 小时前
snap7 开源西门子 S7 通信协议库深度解析
c++·开源
小溪学编程4 小时前
从 C++ 的规范变迁看语言发展
jvm·c++·面试
ShineWinsu4 小时前
对于Redis:string类型的解析
java·c++·redis·分布式·缓存·面试·string
YYYing.5 小时前
【设计模式系列 (七) 】桥接模式
c++·后端·设计模式·桥接模式
高山有多高6 小时前
【Linux笔记】Linux自定义Shell
linux·c++
悠仁さん6 小时前
【C++】vector 类
开发语言·c++
_upupup7 小时前
智能指针的原理及简单模拟实现(C++)
开发语言·c++