LeetCode 692. 前K个高频单词(优先队列)
发布日期:2021-07-01 03:25:17 浏览次数:3 分类:技术文章

本文共 1451 字,大约阅读时间需要 4 分钟。

1. 题目

给一非空的单词列表,返回前 k 个出现次数最多的单词。

返回的答案应该按单词出现频率由高到低排序。

如果不同的单词有相同出现频率,按字母顺序排序。

示例 1:输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2输出: ["i", "love"]解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。    注意,按字母顺序 "i" 在 "love" 之前。 示例 2:输入: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4输出: ["the", "is", "sunny", "day"]解析: "the", "is", "sunny" 和 "day" 是出现次数最多的四个单词,    出现次数依次为 4, 3, 2 和 1 次。 注意:假定 k 总为有效值, 1 ≤ k ≤ 集合元素数。输入的单词均由小写字母组成。 扩展练习:尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/top-k-frequent-words
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 优先队列

struct cmp{
bool operator()(const pair
& a, const pair
& b) {
if(a.second == b.second) return a.first < b.first;//字典序大的在上面 return a.second > b.second;//数量小的在上面 }};class Solution {
public: vector
topKFrequent(vector
& words, int k) {
unordered_map
m; for(string& s : words) m[s]++;//计数 priority_queue
,vector
>,cmp> q; for(auto& mi : m) { if(q.size() < k)//维持大小为k的堆 q.push(mi); else//满了 { if(mi.second > q.top().second)//数量多,进去 { q.pop(); q.push(mi); } else if(mi.second == q.top().second && mi.first < q.top().first) { //数量一样,字典序小进去 q.pop(); q.push(mi); } } } vector
ans; while(!q.empty()) { ans.push_back(q.top().first); q.pop(); } reverse(ans.begin(), ans.end()); return ans; }};

16 ms 11.4 MB

转载地址:https://michael.blog.csdn.net/article/details/106008947 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:LeetCode 583. 两个字符串的删除操作(动态规划)
下一篇:LeetCode 1324. 竖直打印单词

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年05月01日 20时05分28秒