Leetcode692 Top K Frequent Words解题方案

Leetcode692 Top K Frequent Words

题目描述

example:

Input: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
Output: ["i", "love"]
Explanation: "i" and "love" are the two most frequent words.
    Note that "i" comes before "love" due to a lower alphabetical order.
Input: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4
Output: ["the", "is", "sunny", "day"]
Explanation: "the", "is", "sunny" and "day" are the four most frequent words,
    with the number of occurrence being 4, 3, 2 and 1 respectively.

解决方案:

Step1: 统计词频:
	Map<String, Integer> map = new HashMap();
    for (String word: words) {
        map.put(word, map.getOrDefault(word, 0) + 1);
    }
或:
    HashMap<String, Integer> map = new HashMap<>();
    for(String word: words){
        if(map.containsKey(word)){
            map.put(word,map.get(word)+1);
        }else
            map.put(word,1); 
    }
Step2: 比较:
    List<String> result = new ArrayList<>();
    for(String key : map.keySet()){
       result.add(key);
    }
    Collections.sort(result,(word1,word2)->map.get(word1).equals(map.get(word2))?
                     word1.compareTo(word2):map.get(word2)-map.get(word1));
Step3: 输出:
 return result.subList(0,k);

最优解:Heap

Step1: 统计词频:
Map<String, Integer> map = new HashMap();
for (String word: words) {
    map.put(word, map.getOrDefault(word, 0) + 1);
}
Step2: PriorityQueue:
PriorityQueue<String> heap = new PriorityQueue<String>(
                (w1, w2) -> count.get(w1).equals(count.get(w2)) ?
                w2.compareTo(w1) : count.get(w1) - count.get(w2) );
Step3: 从heap提取前k个值,然后倒序输出
 for (String word: count.keySet()) {
            heap.offer(word);
            if (heap.size() > k) heap.poll();
        }

        List<String> ans = new ArrayList();
        while (!heap.isEmpty()) ans.add(heap.poll());
        Collections.reverse(ans);
        return ans;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值