博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
出现次数最多的k个数 Top K Frequent Words
阅读量:6507 次
发布时间:2019-06-24

本文共 2365 字,大约阅读时间需要 7 分钟。

hot3.png

问题:

Given a non-empty list of words, return the k most frequent elements.

Your answer should be sorted by frequency from highest to lowest. If two words have the same frequency, then the word with the lower alphabetical order comes first.

Example 1:

Input: ["i", "love", "leetcode", "i", "love", "coding"], k = 2Output: ["i", "love"]Explanation: "i" and "love" are the two most frequent words.    Note that "i" comes before "love" due to a lower alphabetical order.

Example 2:

Input: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4Output: ["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.

Note:

  1. You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
  2. Input words contain only lowercase letters.

Follow up:

  1. Try to solve it in O(n log k) time and O(n) extra space.

解决:

①  用map,建立每个单词和其出现次数的映射,然后借助PriorityQueue进行自定义的排序,

class Solution {//108ms

    public List<String> topKFrequent(String[] words, int k) {
        List<String> res = new ArrayList<>();
        Map<String,Integer> map = new HashMap<>();//单词与出现次数的映射
        for (String word : words){
            map.put(word,map.getOrDefault(word,0) + 1);
        }
        PriorityQueue<Map.Entry<String,Integer>> priorityQueue =
                new PriorityQueue<>((a,b) -> (a.getValue() == b.getValue() ? b.getKey().compareTo(a.getKey()) : a.getValue() - b.getValue()));//首先将单词按照出现次数由大到小排序,如果次数相同,则按字典序排序
        for (Map.Entry<String,Integer> entry : map.entrySet()){
            priorityQueue.offer(entry);
            if (priorityQueue.size() > k){
                priorityQueue.poll();
            }
        }
        while (! priorityQueue.isEmpty()){
            res.add(0,priorityQueue.poll().getKey());
        }
        return res;
    }
}

② 根据单词出现的次数进行桶排序。

class Solution { //24ms

    public List<String> topKFrequent(String[] words, int k) {
        List<String> res = new ArrayList<>();
        Map<String,Integer> map = new HashMap<>();
        List<String>[] bucket = new List[words.length + 1];
        for (String word : words){
            map.put(word,map.getOrDefault(word,0) + 1);
        }
        for (String key : map.keySet()){
            int count = map.get(key);
            if (bucket[count] == null){
                bucket[count] = new ArrayList<>();
            }
            bucket[count].add(key);
        }
        for (int j = bucket.length - 1;j >= 0 && res.size() < k;j --){
            if (bucket[j] != null){
                Collections.sort(bucket[j]);
                res.addAll(bucket[j]);
            }
        }
        return res.subList(0,k);//
    }
}

转载于:https://my.oschina.net/liyurong/blog/1607617

你可能感兴趣的文章
vue中实现单选
查看>>
1.4linux单用户模式下修改root密码和救援模式修改root密码
查看>>
微服务架构优缺点
查看>>
大幕已拉开,人工智能离我们还有多远?
查看>>
解读userenv的日志
查看>>
跨进程通信之Messenger
查看>>
ext3与ext4区别
查看>>
DHCP Snooping + Dynamic ARP Inspection(DAI) 配置
查看>>
使用应答文件安装域控制器
查看>>
UNIX/Linux 系统管理技术手册阅读(三)
查看>>
btrfs的使用(案例讲解)
查看>>
rpm db 损坏
查看>>
分布式事务-二阶段提交与三阶段提交
查看>>
安装配置samba服务器和客户端
查看>>
filebeat 配置文件详解
查看>>
Swift与OC混编
查看>>
CentOS 5 (64位)下lnmp平台搭建
查看>>
数据迁移
查看>>
nano在CentOS上的安装和使用
查看>>
redhat 6.5 配置WAS控制台中文
查看>>