数据结构与算法笔记:堆——力扣692

题目:

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

思路:

首先要统计每一个单词的出现次数,然后根据次数以及首字母进行排序,最后返回前k个单词。

1.统计次数可以用哈希表.单词本身作为key,单词出现的次数作为value。创建完哈希表,进行赋值的时候要注意,如果这个单词不在哈希表中,那么首先要给这个键对应的值赋为0,然后再在0的基础上+1。

2.排序可以用最小堆。有一点要注意,当这个堆的元素个数超过k时,必须要将堆顶元素剔除,这样遍历完第1步中创建的整个哈希表时,最小堆里面的元素就刚好是我们要的前k个元素。

3.找出来的单词可以放在动态数组里面。

4.因为我们用的是最小堆,所以在最后还要将数组反转再返回。

代码:

public class Solution692 {

    public List<String> topKFrequent(String[] words, int k) {
        HashMap<String,Integer> map=new HashMap<>();
        PriorityQueue<String> minheap=new PriorityQueue<>(
                (w1,w2) -> map.get(w1).equals(map.get(w2)) ? w2.compareTo(w1): map.get(w1)- map.get(w2)
        );
        for (int i = 0; i < words.length; i++){
            if(!map.containsKey(words[i])) map.put(words[i],0 );
            map.put(words[i],map.get(words[i])+1);
        }

        for (String s :map.keySet()) {
            minheap.add(s);
            if(minheap.size()>k) minheap.poll();
        }

        List<String> res=new ArrayList<>() ;
        while (!minheap.isEmpty()) res.add(minheap.poll());
        Collections.reverse(res);
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值