本文共 1451 字,大约阅读时间需要 4 分钟。
给一非空的单词列表,返回前 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 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
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