• LeetCode_优先级队列_692.前K个高频单词


    1.题目

    给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。

    返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序排序。

    示例 1:
    输入: words = [“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 次。

    注意:
    1 <= words.length <= 500
    1 <= words[i] <= 10
    words[i] 由小写英文字母组成。
    k 的取值范围是 [1, 不同 words[i] 的数量]

    进阶:尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/top-k-frequent-words

    2.思路

    (1)哈希表
    ① 使用 hashMap 来保存 words 中不同字符串以及对应出现的频率;
    ② 将hashMap 中的键值对存放到 list 中,然后再重写 list.sort() 中的排序规则
    1)如果单词出现频率相同,按字典顺序排序;
    2)如果单词出现频率不同,按出现频率降序排序;
    ③ 取出 list 中前 k 个元素中的键并保存到 res 中,最后返回 res 即可。

    (2)优先级队列
    思路参考本题官方题解

    该方法的核心思想是:创建一个小根优先队列(即优先队列的队首元素最小)。我们将每一个字符串插入到优先队列中,如果优先队列的大小超过了 k,那么就将优先队列的队首元素弹出。这样最终优先队列中剩下的 k 个元素就是前 k 个出现次数最多的单词。

    3.代码实现(Java)

    //思路1————哈希表
    class Solution {
        public List<String> topKFrequent(String[] words, int k) {
            List<String> res = new ArrayList<>();
            // hashMap 保存 words 中不同字符串以及对应出现的频率
            HashMap<String, Integer> hashMap = new HashMap<>();
            for (String word : words) {
                hashMap.put(word, hashMap.getOrDefault(word, 0) + 1);
            }
            List<Map.Entry<String, Integer>> list = new ArrayList<>(hashMap.entrySet());
            list.sort((o1, o2) -> {
            	//当返回值为正数时,交换 o1 与 o2
                if (o1.getValue().equals(o2.getValue())) {
                    //单词出现频率相同,按字典顺序排序
                    return o1.getKey().compareTo(o2.getKey());
                } else {
                    //单词出现频率不同,按出现频率降序排序
                    return o2.getValue() - o1.getValue();
                }
            });
            for(Map.Entry<String, Integer> map : list) {
                if (k != 0) {
                    res.add(map.getKey());
                    k--;
                } else {
                    break;
                }
            }
            return res;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    //思路2————优先级队列
    class Solution {
        public List<String> topKFrequent(String[] words, int k) {
            List<String> res = new ArrayList<>();
            // hashMap 保存 words 中不同字符串以及对应出现的频率
            HashMap<String, Integer> hashMap = new HashMap<>();
            for (String word : words) {
                hashMap.put(word, hashMap.getOrDefault(word, 0) + 1);
            }
            PriorityQueue<Map.Entry<String, Integer>> queue = new PriorityQueue<>((entry1, entry2)->{
                if (entry1.getValue().equals(entry2.getValue())) {
                    //单词出现频率相同,按字典顺序排序
                    return entry2.getKey().compareTo(entry1.getKey());
                } else {
                    //单词出现频率不同,按出现频率降序排序
                    return entry1.getValue() - entry2.getValue();
                }
            });
            for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
                queue.offer(entry);
                if (queue.size() > k) {
                    queue.poll();
                }
            }
            while (!queue.isEmpty()) {
                res.add(queue.poll().getKey());
            }
            Collections.reverse(res);
            return res;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
  • 相关阅读:
    记忆力减退之QTableMode与数据库关联
    NLP(14)--文本匹配任务
    基于SqlSugar的开发框架循序渐进介绍(14)-- 基于Vue3+TypeScript的全局对象的注入和使用
    Nginx显示500错误原因和解决方法
    浅谈 Class.forName() 的用法
    正规矩阵(normal matrix)
    分布式集群——搭建Hadoop环境以及相关的Hadoop介绍
    瓦斯抽采VR应急救援模拟仿真系统筑牢企业安全生产防线
    Java on VS Code 8月更新|Spring 功能更新、构建工具改进及调试体验提升
    Java——String类
  • 原文地址:https://blog.csdn.net/weixin_43004044/article/details/126260616