java算法第十三天 | ● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 ● 总结

239. 滑动窗口最大值

leetcode链接 之前讲的都是栈的应用,这次该是队列的应用了。
本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。

思路: 自定义一个单调队列维护当前滑动窗口的最大值。
代码随想录解题思路
注意: 本题的重点在于如何实现自定义单调队列中的poll、add、peek方法。以实现队首的元素是当前滑动窗口的最大元素。
ArrayDeque、LinkedList均可实现:==pollLast( )/removeLast( )、peekLast( )/getLast( )==方法,但本题使用ArrayDeque效率更高。

class MyDeque{Deque<Integer> queue=new ArrayDeque<>();//或LinkedListpublic void poll(int val){if(!queue.isEmpty() && val==queue.peek()){queue.poll();}}public void add(int val){while(!queue.isEmpty() && val>queue.peekLast()){queue.pollLast();}queue.add(val);}public int getMax(){return queue.peek();}
}class Solution {public int[] maxSlidingWindow(int[] nums, int k) {MyDeque mydeque=new MyDeque();int index=0;int[] res=new int[nums.length-k+1];for(int i=0;i<k;i++){mydeque.add(nums[i]);}res[index++]=mydeque.getMax();for(int i=k;i<nums.length;i++){mydeque.poll(nums[i-k]);mydeque.add(nums[i]);res[index++]=mydeque.getMax();}return res;}
}

时间复杂度:O(n)
空间复杂度:O(k)

347.前 K 个高频元素

leetcode链接
大/小顶堆的应用, 在C++中就是优先级队列
本题是 大数据中取前k值 的经典思路,了解想法之后,不算难。

思路: 这道题目主要涉及到如下三块内容:

  • 要统计元素出现频率
  • 对频率排序
  • 找出前K个高频元素

首先统计元素出现的频率,这一类的问题可以使用map来进行统计。

然后是对频率进行排序,这里我们可以使用一种 容器适配器就是优先级队列

优先级队列

其实就是一个披着队列外衣的堆,因为优先级队列对外接口只是从队头取元素,从队尾添加元素,再无其他取元素的方式,看起来就是一个队列。 而且优先级队列内部元素是自动依照元素的权值排列。

什么是堆

堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。 如果父亲结点是大于等于左右孩子就是大顶堆,小于等于左右孩子就是小顶堆。

为什么不用快排呢?

使用快排要将map转换为数组的结构,然后对整个数组进行排序, 而这种场景下,我们其实只需要维护k个有序的序列就可以了,所以使用优先级队列是最优的。

使用小顶堆呢,还是大顶堆?

我们要用小顶堆,因为要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。

注意:

  • 优先级队列的使用

PriorityQueue<int[]> pq = new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]); //小顶堆
PriorityQueue<int[]> pq = new PriorityQueue<>((pair1,pair2)->pair2[1]-pair1[1]);//默认大顶堆

  • 遍历Map的键值对的方法

for(Map.Entry<Integer,Integer> entry:map.entrySet()){
System.out.println(entry.getKey(),entry.getValue());
}

class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer,Integer> map=new HashMap<>();for(int i : nums){map.put(i,map.getOrDefault(i,0)+1);}PriorityQueue<int[]> pq=new PriorityQueue<>((o1,o2)->(o1[1]-o2[1]));for(Map.Entry<Integer,Integer> entry:map.entrySet()){if(pq.size()<k){pq.add(new int[]{entry.getKey(),entry.getValue()});}else if(pq.peek()[1]<entry.getValue()){pq.add(new int[]{entry.getKey(),entry.getValue()});pq.poll();}}int[] res=new int[k];int index=0;for(int[] i:pq){res[index++]=i[0];}return res;}
}

时间复杂度: O(nlogk)
空间复杂度: O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/722821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React富文本编辑器开发(五)

到目前为止我们所有的功能操作都是直接写在 onKeydown 事件里了&#xff0c;但如果我想复用相同的功能怎么办呢&#xff0c;最好的办法就是拨离了&#xff0c;下面我就形如进行这样的操作&#xff0c;把相关的可复用的命令操作抽取出来。 新建文件 _helper.jsx,创建一个协助器…

游戏引擎渲染流程

一、渲染概述 我们首先看到渲染技术的发展 游戏渲染面临的挑战&#xff1a; 一个容器中同一时刻有大量的游戏对象需要进行渲染&#xff0c;并且不同对象渲染的形式、算法还有所差异&#xff0c;这些使得游戏的绘制系统变得非常复杂&#xff1b;其次&#xff0c;游戏引擎的渲染…

空间直角坐标系、大地坐标系、平面坐标系介绍

空间直角坐标系、大地坐标系、平面坐标系 2017-04-11 13:53 ( 一)空间直角坐标系 空间直角坐标系的坐标原点位于参考椭球的中心,Z轴指向参考椭球的北极,X轴指向起始子午面与赤道的交点,Y轴位于赤道面上切按右手系于X轴呈90度夹角,某点中的坐标可用该点在此坐标系的各…

【深度学习】目标检测神经网络1/2

目标检测神经网络 概念 模型分类有三种&#xff1a;图像分类即输出图像类别和概率&#xff1b;单目标检测&#xff0c;输出目标的概率和位置&#xff1b;多目标检测&#xff0c;同时输出多个目标的分类、位置、概率。 位置检测分为两种形式&#xff1a;一种是矩形框&#xf…

如何分辨Mac设备X86或ARM

在终端中输入如下命令可以获取到当前 Mac 设备是 X86 还是 ARM 类型 uname -a 以上便是此次分享的全部内容&#xff0c;希望能对大家有所帮助!

Vue响应式内容丢失处理

对数组和对象进行不当的修改会使Vue的对象丢失响应式&#xff0c;这时可以直接console.log丢失的对象&#xff0c;看是否有getter和setter 对于数组和对象&#xff0c;只有使用 Vue 提供的一些方法&#xff08;如 push()、pop()、splice()、set() 等&#xff09;进行修改才会触…

linux循环之for循环

1.循环介绍 循环就是迭代(重复)一些命令的代码块&#xff0c;如果循环控制条件不满足的话&#xff0c;就结束循环 2.for循环语法 for 循环控制条件 do commands done #当“循环控制条件”不满足条件&#xff0c;结束for循环 3.for循环样例 [rootkibana ~]# cat for-1.…

css深度选择器 /deep/ 在89版本后就失效了

css深度选择器 /deep/ 在89版本后就失效了 前言&#xff1a;在高版本中&#xff08;89版本以后&#xff09;css使用/deep/样式就失效了 原因&#xff1a;css深度选择器 /deep/ 在89版本后就不支持了 解决办法&#xff1a;使用scss预编译 <style lang"scss" sc…

DxO PureRAW:赋予RAW图像生命,打造非凡视觉体验 mac/win版

DxO PureRAW 是一款专为RAW图像处理而设计的软件&#xff0c;旨在帮助摄影师充分利用RAW格式的优势&#xff0c;实现更加纯净、细腻的图像效果。该软件凭借其强大的功能和易于使用的界面&#xff0c;成为了RAW图像处理领域的佼佼者。 DxO PureRAW 软件获取 首先&#xff0c;Dx…

几种电脑提示mfc140.dll丢失的解决方法,以及如何预防mfc140.dll丢失

mfc140.dll真是一个超级关键的动态链接库文件&#xff01;一旦这个文件不翼而飞&#xff0c;可能会导致一些程序无法顺利运行&#xff0c;甚至给系统带来麻烦。但别担心&#xff01;遇到mfc140.dll文件丢失的情况&#xff0c;我们有一堆应对措施可以立马施行&#xff0c;确保问…

计算机网络-物理层

物理层 基本概念传输媒体信道复用频分复用&#xff08;FDM&#xff09;时分复用&#xff08;TDM&#xff09;波分复用&#xff08;WDM&#xff09;码分复用&#xff08;CDM&#xff09; 宽带接入技术ADSL技术光纤同轴混合网(HFC网)FTTx技术 数据通信常识 上次我们已经大致学习了…

探秘Netty:打造高性能网络通信利器

目录 Netty真强大啊&#xff01;TCP拆包与粘包长连接握手认证心跳机制断线重连机制消息重发机制读写超时机制离线消息线程池结语感谢您的阅读&#xff01; Netty真强大啊&#xff01; Netty是一个基于Java的异步事件驱动的网络应用框架&#xff0c;被广泛应用于高性能、高可靠…

06 - 镜像管理

1 了解镜像 Docker镜像是一个特殊的文件系统&#xff0c;除了提供容器运行时所需的程序、库、资源、配置等文件外&#xff0c;还包含了一些为运行时准备的一些配置参数&#xff08;如匿名卷、环境变量、用户等&#xff09;。 但注意&#xff0c; 镜像不包含任何动态数据&#…

【探索AI】二十五 深度学习之第8周:深度学习项目实战

项目名称&#xff1a;基于深度学习的图像分类系统 一、项目背景 随着大数据和人工智能技术的快速发展&#xff0c;图像分类技术在各个领域得到了广泛应用&#xff0c;如安防监控、医疗诊断、自动驾驶等。本项目旨在利用深度学习技术构建一个高效的图像分类系统&#xff0c;实…

C++高级面试题:请解释 C++ 中的递归模板(Recursive Templates)

请解释 C 中的递归模板&#xff08;Recursive Templates&#xff09; 递归模板&#xff08;Recursive Templates&#xff09;是一种使用模板递归定义的技术&#xff0c;在编译时生成具有不同结构的代码。这种技术通常用于处理数据结构或实现算法&#xff0c;其中需要对数据进行…

Mysql数据迁移3个快速方法与数据库恢复

目录 Mysql数据迁移3个快速方法与数据库恢复 方法1 选中表复制粘贴 方法2 克隆 方法3 DTS迁移【推荐】 数据库误删恢复方法 Mysql数据迁移3个快速方法与数据库恢复 前言&#xff1a;日常开发中&#xff0c;项目测试发布到生产或者复制多一套程序出来&#xff0c;经常免不…

QT C++实践| 连接数据库的登录界面实现| 附源码

前言 在之前的两篇博客中QT C实战&#xff1a;实现用户登录页面及多个界面跳转、QT C实践|超详细数据库的连接和增删改查操作|附源码分别详细讲解了&#xff1a;登录界面的制作&#xff08;UI布局、页面跳转、登录逻辑等&#xff09;、QT如何连接Mysql数据库&#xff0c;并进行…

node的概念

node和浏览器有什么区别和联系&#xff0c;及node进行服务端开发的本质 Node.js和浏览器在JavaScript运行环境方面存在一些区别和联系。 区别&#xff1a; 运行环境&#xff1a;Node.js是一个服务器端JavaScript运行环境&#xff0c;而浏览器是一个客户端JavaScript运行环境…

EPSON RA8000CE (RTC模块)压电侠

RA8000CE是一个集成了32.768 kHz数字温度补偿晶体振荡器(DTCXO)的RTC模块。它包括各种功能&#xff0c;如具有闰年校正的秒到年时钟/日历&#xff0c;时间警报&#xff0c;唤醒计时器&#xff0c;时间更新中断&#xff0c;时钟输出和时间戳功能&#xff0c;可以在外部或内部事件…

C++--调整数组顺序使奇数位于偶数前面

题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有的奇数位于数组的前半部分&#xff0c;所有的偶数位于数组的后半部分&#xff0c;并保证奇数和奇数&#xff0c;偶数和偶数之间的相对位置不变。 方法一&#xff1a; …