692.前K个高频单词

该博客主要讲解如何解决LeetCode中的第692题,即找出给定单词列表中出现频率最高的前k个单词。作者首先提出了使用HashMap记录单词及其出现次数的方法,通过遍历列表并利用HashMap.getOrDefault设置默认值。在遍历结束后,将HashMap的键转换为ArrayList并进行自定义排序,排序依据是单词的出现次数和字母顺序。博客提供了Java代码实现,并分析了时间复杂度为O(NlogN)和空间复杂度为O(N)。
摘要由CSDN通过智能技术生成

题目:

给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。

示例:
示例

解题思路:

先不考虑复杂度,这个题涉及到字符串排序,首先想到大根堆小根堆以及hashmap。大根堆小根堆还不熟,先考虑hashmap,想法是key,value(String,Integer),每重复一个加1,先设默认值,用hashmap.getOrDefault(String a,0)来设初始Integer为零。
第一步遍历完之后,时间复杂度为O(N),空间复杂度最坏情况(没有重复项)为为O(N)
第二步用一个list来存hashmap里面的key,直接用hashmap.keySet()初始化到ArrayList数组里即可。
第三步对数组进行自定义的排序,需要重写compare方法,这个之前没遇到过,需要牢记。
由于是最大排序,首先看hashmap里面该字符出现的次数,谁最大放前面,所以返回的是b.count-a.count。但是当次数相同时,按照谁小(字母表在前面)谁在前面,则返回a.compareTo(b),具体看一下代码。

参考:

爱情不够甜692.前K个高频单词
Java代码:

public class Solution {

    public List<String> topKFrequent(String[] words, int k) {
        // 1.初始化 哈希表 key -> 字符串 value -> 出现的次数。
        Map<String, Integer> count = new HashMap<>();
        for (String word : words) {
            count.put(word, count.getOrDefault(word, 0) + 1);
        }
        // 2.用 list 存储字符 key 然后自定义 Comparator 比较器对 value 进行排序。
        List<String> candidates = new ArrayList<>(count.keySet());
        //这里是常规写法
        // list.sort(new Comparator<String>(){
        //     @Override
        //     public int compare(String a,String b){
        //         if(map.get(a)==map.get(b)){
        //             return a.compareTo(b);
        //         }else{
        //             return map.get(b)-map.get(a);
        //         }
        //     }
        // });
        // 此处为使用 lambda 写法
        candidates.sort((a, b) -> {
            // 字符串频率相等按照字典序比较使得大的在堆顶,Java 可以直接使用 compareTo 方法即可。
            if (count.get(a).equals(count.get(b))) {
                return a.compareTo(b);
            } else {
                // 字符串频率不等则按照频率排列。
                return count.get(b) - count.get(a);
            }
        });
        // 3.截取前 K 大个高频单词返回结果。
        return candidates.subList(0, k);        
    }    
}

复杂度分析:
时间复杂度是前期遍历O(n),排序O(nlogn)最终就是O(NlogN),空间复杂度O(N),需要能存储N个字符串的hashmap和数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值