[抄题]:

给一个单词列表,求出这个列表中出现频次最高的K个单词。

[思维问题]:

  1. 以为已经放进pq里就不能改了。其实可以改,利用每次取出的都是顶上的最小值就行了。(性质)
  2. 不知道怎么处理k个之外的数:先把peak, newpair拿出来

[一句话思路]:

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. 比较之前要新建对象。right.key.compareTo(left.key)是反的,而且需要单独写出来,因为比较的是key是否相同
  2. for (String word : words),word的作用类似于i,作为临时变量来使用
  3. 取出所有的key,用的是counter.keySet()
  4. 用comparator的compare方法来比较
  5. Q.poll().key表示取出头元素

[二刷]:

  1. comparator是自己定义的,除了heap中,别的地方不能用,加关键字private
  2. pq里装的是pair, 不是string
  3. pair类中的函数是public pair,不是int

[三刷]:

  1. peak, newpair要先取出来,因为不足k时添加的也是newpair

[四刷]:

[五刷]:

[总结]:

[复杂度]:Time complexity: O(nlgk) Space complexity: O(n)

[英文数据结构,为什么不用别的数据结构]:

pq 每次取出最小值,不用删除下面的元素 所以不用tree

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

347. Top K Frequent Elements,一模一样的:除了pair里的东西不一样

class Solution {
class Pair {
String key;
int value;
public Pair(String key,int value) {
this.key = key;
this.value = value;
}
}; private Comparator<Pair> pairComparator = new Comparator<Pair>() {
public int compare(Pair left,Pair right) {
if (left.value != right.value) {
return left.value - right.value;
}
return right.key.compareTo(left.key);
}
};
public List<String> topKFrequent(String[] words, int k) {
//HashMap
if (k == 0) {
return null;
}
HashMap<String,Integer> counter = new HashMap<String,Integer>();
for (String word : words) {
if (counter.containsKey(word)) {
counter.put(word,counter.get(word) + 1);
}
else if (!counter.containsKey(word)) {
counter.put(word,1);
}
}
//minHeap
Queue<Pair> Q = new PriorityQueue<Pair>(k,pairComparator);
for (String word : counter.keySet()) {
Pair peak = Q.peek();
Pair newPair = new Pair(word,counter.get(word));
if (Q.size() < k) {
Q.add(newPair);
}
else if (pairComparator.compare(newPair,peak) > 0) {
Q.poll();
Q.add(newPair);
}
}
//result
List<String> result = new ArrayList<String>();
while (!Q.isEmpty()) {
result.add(0,Q.poll().key);
} return result;
}
}

最高频的K个单词 · Top K Frequent Words的更多相关文章

  1. 华为OJ2051-最小的K个数(Top K问题)

    一.题目描述 描述: 输入n个整数,输出其中最小的k个. 输入: 输入 n 和 k 输入一个整数数组 输出: 输出一个整数数组 样例输入: 5 2 1 3 5 7 2 样例输出: 1 2 二.Top ...

  2. [Swift]LeetCode692. 前K个高频单词 | Top K Frequent Words

    Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...

  3. hihoCoder 1133 二分·二分查找之k小数(TOP K算法)

    #1133 : 二分·二分查找之k小数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很 ...

  4. 必考算法之 Top K 问题

    大家好,这里是<齐姐聊算法>系列之 Top K 问题. Top K 问题是面试中非常常考的算法题. 8 Leetcode 上这两题大同小异,这里以第一题为例. 题意: 给一组词,统计出现频 ...

  5. top(k,n)—db kernel队解题思路

    0. 比赛 公司里的第三届XX中间件性能挑战赛 我和另外两个P5组队参加,队名为"db kernel".最后获得了第八,应该是P5里的最高排名. 以下简单扼要地介绍一下题目,以及我 ...

  6. [LeetCode] Top K Frequent Words 前K个高频词

    Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...

  7. [LeetCode] Top K Frequent Elements 前K个高频元素

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

  8. Top K Frequent Elements 前K个高频元素

    Top K Frequent Elements 347. Top K Frequent Elements [LeetCode] Top K Frequent Elements 前K个高频元素

  9. [LeetCode] 347. Top K Frequent Elements 前K个高频元素

    Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...

随机推荐

  1. [UE4]C++调用蓝图函数:BlueprintImplementableEvent函数说明符用法

    用BlueprintImplementableEvent标明的函数在C++代码中不需要有方法体,方法体在蓝图中实现. 用法: 1,现在C++头文件中定义函数名 UFUNCTION(BlueprintI ...

  2. Android RIL Architecture

    Android RIL Architecture   by Gomathi Sankar   Introduction   The Article explains about the buildin ...

  3. 向Nexus仓库推送/使用各种组件

    1.Nuget仓库 使用NuGetPackageExplorer打包制作自己的nupkg https://github.com/NuGetPackageExplorer/NuGetPackageExp ...

  4. 基于Vue的Ui框架

    基于Vue的Ui框架 饿了么公司基于vue开的的vue的Ui组件库 Element Ui 基于vue pc端的UI框架 http://element.eleme.io/ MintUi 基于vue 移动 ...

  5. Chrome 鼠标左键-新标签打开

    改chrome设置 1.打开google搜索主页2.打开右下角Settings选项->Search Settings3.找到where results open选项4.把Open each se ...

  6. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #17 如何使用ext4

    HACK #17 如何使用ext4 本节介绍ext4的编写和挂载方法.开发版ext4的使用方法.ext4是ext3的后续文件系统,从Linux 2.6.19开始使用.现在主要的发布版中多数都是采用ex ...

  7. 中国标准时间改为formatTime格式

    1.toLocaleDateString (根据本地时间把Date 对象的日期部分转换为字符串): var time = new Date(); var formatTime = time.toLoc ...

  8. 关系型数据库之Mysql

    简介 主要知识点包括:能够与mysql建立连接,创建数据库.表,分别从图形界面与脚本界面两个方面讲解 相关的知识点包括:E-R关系模型,数据库的3范式,mysql中数据字段的类型,字段约束 数据库的操 ...

  9. 24. (ora-01410无效的rowid)临时表 on commit delete rows 与 on commit preserve rows 的区别

    ora-01410无效的rowid解决方式: 把临时表空间改成会话级别的就可以了,即把临时表的创建选项由on commit delete rows改为on commit preserve rows,就 ...

  10. iOS 真机调试 Xcode 显示 device Error: device unavailable

    一般来说有两个原因: 1. iphone没有加到test device里,将iphone的设备id加到test device列表里 2. Xcode不支持当前的iOS版本,将Xcode升级到最新版