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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关推荐
lueluelue477 小时前
LeetCode:链表
算法·leetcode·链表
橘子汽水16810 小时前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
Tri_Function10 小时前
动态规划DP1(c++)
c++
清水迎朝阳13 小时前
客户端软件 — 用户统计方案
服务器·c++·客户端·用户统计
Re.不晚13 小时前
挑战做100道力扣算法- DAY1
算法·leetcode·职场和发展
青山木14 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
再卷也是菜14 小时前
C++17(下)
c++
alexwang21115 小时前
HDU 4348 详细题解
c++·算法·题解·hdu·主席树·可持久化数据结构·可持久化线段树
程序员zgh15 小时前
C++ 拷贝赋值运算符 详解
c语言·开发语言·c++
皓月斯语16 小时前
B2132 素数对
c++·算法·题解