LeetCode 692. 前K个高频单词

1、题目

前K个高频单词 - 力扣(LeetCode) https://leetcode-cn.com/problems/top-k-frequent-words/

2、题解

本题首先就是需要统计相同单词的个数,使用单词的值来作为HashMap的K,每计数一次就加一。之后我们需要写一个优先队列来设置排序的规则。在比较器中将单词先按单词长度,再按字母升序的顺序进行排序。然后将hashMap中的字符串添加到优先队列之中,如果超过我们所要的字符串数量,就调用poll()移除队首元素.【因为Java的优先队列是二叉树小顶堆,所以队首元素就是最小的那个。比较大小的规则由比较器决定。】最后再将优先队列中的单词添加到result集合中,反转result即可。【因为我们在长度部分是升序排列,所以需要反转一下。】

3、代码

 class Solution {
        public List<String> topKFrequent(String[] words, int k) {
            //数个数
            HashMap<String, Integer> contentMap = new HashMap<>();
            for (String word:words) {
            
                contentMap.put(word,contentMap.getOrDefault(word,0)+1);
            }
            //新建对象的时候可以指定一个初始容量,其容量会自动增加。
            PriorityQueue<String> priorityQueue = new PriorityQueue<>(k, new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    //升序前减后,降序后减前,这里选择升序。
                    //o1.compareTo(o2)会返回一个int值,如果0说明o1和o2相等,如果返回负值,那么o1和o2会倒序排序,返回正值,那么o1和o2会正序排序。                
                    return contentMap.get(o1).equals(contentMap.get(o2))?o2.compareTo(o1):contentMap.get(o1)-contentMap.get(o2);
                }
            });
            for (String word:contentMap.keySet()) {
                priorityQueue.offer(word);
                if(priorityQueue.size()>k){
                    priorityQueue.poll();
                }
            }
            ArrayList<String> result = new ArrayList<>();
            while (!priorityQueue.isEmpty()){
                result.add(priorityQueue.poll());
            }
            //反转
            Collections.reverse(result);
            return result;
        }
    }

4、执行结果

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,525评论 0 3
  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 1,824评论 0 2
  • 动态规划 111. 爬楼梯思路类似斐波那契数列注意考虑第 0 阶的特殊情况 272. 爬楼梯 II思路类似上题,只...
    6默默Welsh阅读 2,461评论 0 1
  • 知识点总结 二分查找法(二分查找法是弱点)**以及相关的操作:递归实现和非递归实现,floor 和 ceiling...
    李威威阅读 955评论 0 0
  • 前两天有一篇主题为“北京打拼很辛苦,华为公积金被偷偷降很寒心,不敢告诉家人…”的文章引发广大网友的热议。 从图中可...
    职场解忧君阅读 1,011评论 0 1