package com.lt.datastructure.MaxHeap;

import java.util.LinkedList;
import java.util.List;
import java.util.TreeMap; import com.lt.datastructure.Queue.PriorityQueue;
/**
LeetCode347
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
说明:
你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。 频次: 用map 复杂度优于O(nlogn):优先队列 频次越低,优先于越高
1 TreeMap存储,键存数组的值,值存数组的值频次
2 新建Freq类,成员属性是e,freq,实现Comparable,重写CompareTo,相反地,频次小的优先级高,返回1
3 优先队列存储Freq,遍历map,如果没存满k个,继续入队,如果存满了,将队首元素和新元素的频次比较,优先级高的(频次低)出队
4 用LinkedList存储优先队列中的元素,作为结果输出
*/
public class Solution{
private class Freq implements Comparable<Freq>{
public int e,freq;
public Freq(int e, int freq) {
this.e = e;
this.freq = freq;
}
@Override
public int compareTo(Freq another) {
if(this.freq < another.freq){
return 1;
}else if(this.freq > another.freq){
return -1;
}else{
return 0;
}
} }
public List<Integer> topKFrequent(int[] nums, int k) { //映射存储元素和频次
TreeMap<Integer,Integer> map = new TreeMap<>();
for(int num : nums){
if(map.containsKey(num)){
map.put(num, map.get(num)+1);
}else{
map.put(num, 1);
}
}
//优先队列存储前k个频次最高的元素
PriorityQueue<Freq> pq = new PriorityQueue<>();
for(int key : map.keySet()){
//没存满,继续存
if(pq.getSize()<k){
pq.enqueue(new Freq(key,map.get(key)));
//存满了,比较次数,次数低的优先级高,出队,频次高的入队
}else if(map.get(key)>pq.getFront().freq){
pq.dequeue();
pq.enqueue(new Freq(key,map.get(key)));
}
}
//将优先队列的元素存于链表并作为结果输出
LinkedList<Integer> res = new LinkedList<>();
while(!pq.isEmpty()){
res.add(pq.dequeue().e);
}
return res;
}
}
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.TreeMap; public class Solution { private class Freq implements Comparable<Freq>{ //元素,频次
public int e,freq;
public Freq(int e , int freq) {
this.e = e;
this.freq = freq;
} @Override
public int compareTo(Freq another) {
if(this.freq < another.freq){
return -1;
}
else if(this.freq > another.freq){
return 1;
}else{
return 0;
}
} } public List<Integer> topKFrequent(int[] nums, int k) { Map<Integer, Integer> map = new TreeMap<>();
for (int i : nums) {
if(map.containsKey(i)){
map.put(i, map.get(i) + 1);
}else{
map.put(i, 0);
}
} //最小堆,频次最高的优先出队
PriorityQueue<Freq> queue = new PriorityQueue<>();
for(int key : map.keySet()){
if(queue.size() < k){
queue.add(new Freq(key, map.get(key)));
}
else if(map.get(key) > queue.peek().freq){
queue.remove();
queue.add(new Freq(key, map.get(key)));
}
} LinkedList<Integer> res = new LinkedList<>();
while(!queue.isEmpty()){
res.add(queue.remove().e);
}
return res;
}
}

LeetCode347:返回频率前K高的元素,基于优先队列实现的更多相关文章

  1. LeetCode347——优先队列解决查询前k高频率数字问题

    给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 例如, 给定数组 [1,1,1,2,2,3] , 和 k = 2,返回 [1,2]. 注意: 你可以假设给定的 k 总是合理的,1 ≤ k ...

  2. [Swift]LeetCode347. 前K个高频元素 | Top K Frequent Elements

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

  3. 前K个高频元素

    给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], ...

  4. Leetcode 347.前K个高频元素 By Python

    给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], ...

  5. 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)

    目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...

  6. LeetCode:前K个高频元素【347】

    LeetCode:前K个高频元素[347] 题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [ ...

  7. 代码题(3)— 最小的k个数、数组中的第K个最大元素、前K个高频元素

    1.题目:输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 快排思路(掌握): class Solution { public ...

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

    给定一个非空的整数数组,返回其中出现频率前 k 高的元素.例如,给定数组 [1,1,1,2,2,3] , 和 k = 2,返回 [1,2].注意:    你可以假设给定的 k 总是合理的,1 ≤ k ...

  9. 347. 前K个高频元素

    题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = ...

随机推荐

  1. HDU1875 畅通工程再续

    相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全 ...

  2. (转)Oracle数据库备份与恢复总结

    http://blog.csdn.net/xyz846/article/details/6437963 http://blog.csdn.net/hollboy/article/details/867 ...

  3. C++中的sort函数和⾃定义cmp函数

    写在最前面,本文摘录于柳神笔记: sort 函数在头⽂件 #include ⾥⾯,主要是对⼀个数组进⾏排序( int arr[] 数组或 者 vector 数组都⾏), vector 是容器,要⽤ v ...

  4. vue 的模拟数据

    首先分析需要什么数据,然后在build下 找到dev-server.js 在里面有一个var 项目名 = express() 在后面添加我们自己需要模拟的数据路由 // 自己添加路由 读取数据 sta ...

  5. Python爬虫解析网页的4种方式 值得收藏

    用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. ​ 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存 ...

  6. ubuntu13.10更新sources.list

    步骤: 1>设置网络连接方式,NAT 2>自动获取ip address 10.0.2.15 3>更新源soureces.list soureces.list deb http://m ...

  7. mysql 连接数据库时时区报错

    1.url: jdbc:mysql://192.168.0.101:3306/testdb?serverTimezone=UTC,在连接字符后面添加时区设置 2.使用navicat或者直接使用mysq ...

  8. springboot 重写 AuthorizationFilter

    原文链接:https://www.cnblogs.com/zeussbook/p/10778532.html

  9. [理解] Linux 作为一个服务器是怎样的存在 (一)

    长期以来我就一直有一个疑问, 为什么当我们选择使用服务器的时候都会选择 Linux 作为操作系统, 以至于只要说到服务器就会不由自主的想到Linux, 那么Linux到底是什么呢? 当然我也不会妄谈天 ...

  10. Codeforces 1260 ABC

    DEF 题对于 wyh 来说过于毒瘤,十分不可做. A. Heating Description: 给定\(a,b\),将\(b\)分成至少\(a\)个正整数,使这些正整数的平方和最小. Soluti ...