239. 滑动窗口最大值

一刷遇到的第一道Hard题。
思路:本题自定义单调队列,入队的时候会把前面较小的值都移除掉,使得队列顶部的元素永远是最大的,只维护最大值,因为题目需要把最大值输出。这样方便后续弹出最大值,滑动窗口移动时,已经被弹出的较小值,就不用再弹出一次了。

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int[] result = new int[nums.length-k+1];MyQueue myQueue = new MyQueue();for(int i=0; i<k; i++){myQueue.add(nums[i]);}int index = 0;result[index++] = myQueue.peek();for(int i=k; i<nums.length; i++){myQueue.remove(nums[i-k]);myQueue.add(nums[i]);result[index++] = myQueue.peek();}return result;}class MyQueue{Deque<Integer> deque = new LinkedList<>();public void add(int val){while (!deque.isEmpty() && deque.getLast()<val){deque.removeLast();}deque.add(val);}public void remove(int val){if (!deque.isEmpty() && deque.peek()==val){deque.remove();}}public int peek(){return deque.peek();}}
}

347. 前 K 个高频元素

思路:使用优先级队列实现大顶堆或者小顶堆。先用map记录每个num(key)和出现次数(value)

  • 大顶堆:遍历map把元素从大到下放入大顶堆,最后输出前k个元素。
  • 小顶堆:只维护前k个元素,比大顶堆节省空间,只不过每次都要弹出最小元素,多一步操作。
/*Comparator接口说明:* 返回负数,形参中第一个参数排在前面;返回正数,形参中第二个参数排在前面* 对于队列:排在前面意味着往队头靠* 对于堆(使用PriorityQueue实现):从队头到队尾按从小到大排就是最小堆(小顶堆),*                                从队头到队尾按从大到小排就是最大堆(大顶堆)--->队头元素相当于堆的根节点* */
class Solution {//解法1:基于大顶堆实现public int[] topKFrequent1(int[] nums, int k) {Map<Integer,Integer> map = new HashMap<>();//key为数组元素值,val为对应出现次数for(int num:nums){map.put(num,map.getOrDefault(num,0)+1);}//在优先队列中存储二元组(num,cnt),cnt表示元素值num在数组中的出现次数//出现次数按从队头到队尾的顺序是从大到小排,出现次数最多的在队头(相当于大顶堆)PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2)->pair2[1]-pair1[1]);for(Map.Entry<Integer,Integer> entry:map.entrySet()){//大顶堆需要对所有元素进行排序pq.add(new int[]{entry.getKey(),entry.getValue()});}int[] ans = new int[k];for(int i=0;i<k;i++){//依次从队头弹出k个,就是出现频率前k高的元素ans[i] = pq.poll()[0];}return ans;}//解法2:基于小顶堆实现public int[] topKFrequent2(int[] nums, int k) {Map<Integer,Integer> map = new HashMap<>();//key为数组元素值,val为对应出现次数for(int num:nums){map.put(num,map.getOrDefault(num,0)+1);}//在优先队列中存储二元组(num,cnt),cnt表示元素值num在数组中的出现次数//出现次数按从队头到队尾的顺序是从小到大排,出现次数最低的在队头(相当于小顶堆)PriorityQueue<int[]> pq = new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]);for(Map.Entry<Integer,Integer> entry:map.entrySet()){//小顶堆只需要维持k个元素有序if(pq.size()<k){//小顶堆元素个数小于k个时直接加pq.add(new int[]{entry.getKey(),entry.getValue()});}else{if(entry.getValue()>pq.peek()[1]){//当前元素出现次数大于小顶堆的根结点(这k个元素中出现次数最少的那个)pq.poll();//弹出队头(小顶堆的根结点),即把堆里出现次数最少的那个删除,留下的就是出现次数多的了pq.add(new int[]{entry.getKey(),entry.getValue()});}}}int[] ans = new int[k];for(int i=k-1;i>=0;i--){//依次弹出小顶堆,先弹出的是堆的根,出现次数少,后面弹出的出现次数多ans[i] = pq.poll()[0];}return ans;}
}

总结

单调队列常用来解决滑动窗口。
优先级队列实现类似大顶堆、小顶堆的效果。

day13—栈和队列完结相关推荐

  1. 用JS描述的数据结构及算法表示——栈和队列(基础版)

    前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...

  2. 栈和队列在python中的实现

    栈和队列是两种基本的数据结构,同为容器类型,队列是先进先出,栈是先进后出. 栈 栈提供 push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterat ...

  3. c++数据结构队列栈尸体_一本正经的聊数据结构(3):栈和队列

    前文传送门: 「一本正经的聊数据结构(1):时间复杂度」 「一本正经的聊数据结构(2):数组与向量」 引言 前一篇内容我们介绍了数组和向量,虽然说向量是数组的一个升级版,但是在另一个维度上,他们都属于 ...

  4. 剑指offer:面试题09. 用两个栈实现队列

    题目:用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有 ...

  5. leetcode-232 用栈实现队列

    使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部. pop() – 从队列首部移除元素. peek() – 返回队列首部的元素. empty() – 返回队列是否为空 栈的特点 ...

  6. 保存数组_面试官:讲一讲你对据结构——数组、链表、栈、队列的理解

    一.解释定义 1. 数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.再简单描述一下:数据结构就是描述对象间逻辑关系的学科. 如果还是不太清楚下面会举例说明的. 2. 数据存储结 ...

  7. 数据结构,堆和栈和队列的概念

    数据结构,堆和栈和队列的概念 1 什么是数据结构 数据结构是计算机存储,组织数据的反复改.数据结构是指相互之间存在的一种或多种特定关系的数据元素集合. 2 数据结构的逻辑结构 1 集合结构,元素都是孤 ...

  8. Java数据结构与算法(第四章栈和队列)

    2019独角兽企业重金招聘Python工程师标准>>> 本章涉及的三种数据存储类型:栈.队列和优先级队列. 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构,和其他结构( ...

  9. 学习JavaScript数据结构与算法(一):栈与队列

    本系列的第一篇文章: 学习JavaScript数据结构与算法(一),栈与队列 第二篇文章:学习JavaScript数据结构与算法(二):链表 第三篇文章:学习JavaScript数据结构与算法(三): ...

最新文章

  1. 机器学习服务第一梯队都有谁?权威研究机构Forrester发布最新报告
  2. 给自己提个醒:关于document.getElementsByName无法获取非表单元素
  3. 使用动态代理,提高工作效率
  4. python调用dll函数_从Python调用DLL函数
  5. Win32程序中使用Combo box控件
  6. 硬件结构图_那曲地表水电子除垢仪结构图
  7. ftp上传文件夹_ftp同步软件哪个好,ftp同步软件哪个好,6款好用推荐
  8. java 调用sqlite_java 调用 sqlite 数据库
  9. linux 运行段错误,在linux下代码运行出现段错误,求大神
  10. UNITY自带的3D object没有三角形?
  11. [2017.01.04] 经典排序算法思想及其实现
  12. 梦到两个人辞职,一男一女
  13. 基于VGG19的图片分割网络
  14. 【NOWCODER】- Python:列表(一)
  15. chrome 您的浏览器禁用了Javascript
  16. 【NX2023/1847】UG软件安装详细指南教程
  17. 宁德时代与戴姆勒卡车股份公司扩大全球合作伙伴关系
  18. python保留两位小数_python格式化输出保留2位小数的实现方法
  19. js给对象添加变量属性 js 更改对象中的属性名 数组对象中每个对象添加一个字段-map用法和forEarch用法
  20. 网络安全小白众测如何快速发现安全问题思路

热门文章

  1. yoga11rt系统刷linux,yoga 11 的Windows RT系统如何刷成平板安卓系统?
  2. 烘焙行业新店开业方案
  3. 区块链BaaS云服务(23)网易NBaaS平台
  4. Python错误 TypeError: ‘NoneType‘ object is not subscriptable解决方案汇总
  5. 计算机专业学校运动会霸气口号,学校运动会的霸气入场口号
  6. 快速阅读技术书籍方法
  7. js实现在线RSA公钥私钥对生成,加密/解密
  8. PowerDesigner添加索引
  9. JavaScript禁用复制
  10. python全局变量的声明和使用