优先队列 PriorityQueue
时间:2019-02-16
本文章向大家介绍优先队列 PriorityQueue,主要包括优先队列 PriorityQueue使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 PriorityQueue
实现方式
1.1 时间复杂度
2 返回数据流中第 K 大元素
https://leetcode.com/problems/kth-largest-element-in-a-stream/
- 最大的值,保存前 K 个,每次来的新的值,只要比保存的 K 个值的最小值大,则剔除原来 K 个值得最小值;
class KthLargest {
private PriorityQueue<Integer> q;
private int k;
public KthLargest(int k, int[] nums) {
this.k = k;
q = new PriorityQueue<>(k);
for (int num : nums) {
add(num);
}
}
public int add(int val) {
if (q.size() < k) {
q.offer(val);
} else if (q.peek() < val) {
q.poll();
q.offer(val);
}
return q.peek();
}
}
3 返回滑动窗口的最大值
- 思路1 :
Max Heap
1. 维护 heap , 时间复杂度 O (logK)
2. 取最大值:时间复杂度 O(1)
3. 总体的时间复杂度: N * log K
- 思路2: 双端队列
时间复杂度:O (N*1)
package heap;
import java.util.ArrayDeque;
import java.util.Deque;
public class SlidWindowMax_239 {
public int[] maxSlidingWindow(int[] nums, int k) {
/*
*
* 判断最大元素是否超出滑动窗口,若超出则将最大元素移除队列
* 可以保证队列内的元素始终小于等于 k 个,这个才是整个算法的关键
* 注意队列里放的是元素的索引,而不是元素的值
* */
if (nums == null || k <= 0) {
return new int[0];
}
int n = nums.length;
int[] r = new int[n - k + 1];
int ri = 0;
//store index
Deque<Integer> q = new ArrayDeque<>(k);
for (int i = 0; i < nums.length; i++) {
// remove numbers out of range k
if (!q.isEmpty() && q.peek() < i - k + 1) {
q.poll();
}
// 新的元素 a[i] 要入队,入队之前要先清除比 a[i] 小的元素
// 新元素进入window要从右侧元素开始比较,不能从左侧比较。
while (!q.isEmpty() && nums[q.peekLast()] <= nums[i]) {
q.pollLast();
}
q.offer(i);
if (i >= k - 1) {
r[ri++] = nums[q.peek()];
}
}
return r;
}
}
- 独家: iOS是如何收集用户的地理信息的
- Hygieia 为何物?DevOps 利器也
- 汽车攻击离你很近:一分钟变成汽车黑客
- LIFX智能灯泡漏洞泄露WIFI密码
- android ViewPager+Fragment之懒加载
- 逆向APK进行smali注入实现“秒破WIFI”
- 我所理解的Android 启动模式
- 搭建开源入侵检测系统Snort,并实现与防火墙联动
- 如何在Python中为长短期记忆网络扩展数据
- android 开发Handler源码剖析
- Keras作为TensorFlow的简化界面:教程
- Android基础:Fragment,看这篇就够了
- Rest api简介
- crossdomain.xml文件配置不当利用手法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RTSP网络摄像头网页无插件直播视频平台EasyNVR自定义标题和CopyRight步骤
- 设计模式~解释器
- RTSP/GB28181/HIKSDK/Ehome协议视频上云服务平台EasyCVR人脸识别开发ArcSoftFace环境搭建
- RTSP/GB28181/HIKSDK/EHome流媒体协议视频上云网关EasyCVR流地址密码不正确如何修正?
- tmux终端意外出现控制字符
- clickhouse编译安装以及搭建mysql实时复制
- Linux回收站机制实现过程及用法详解
- Linux如何基于AIDE检测文件系统完整性
- MySQL压测时Linux中断异常飚高,原来是因为...
- Ubuntu20.04防火墙设置简易教程(小白)
- linux上搭建私有Git服务器的详细教程
- Centos7 安装 Mysql8教程
- linux下快速列出局域网中所有主机名(计算机名)的脚本
- 详解Linux重定向用法
- Zabbix基于snmp实现监控linux主机