Day13 : 队列 LeedCode:239. 滑动窗口最大值 347.前 K 个高频元素

详细讲解:点击跳转

239. 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       31 [3  -1  -3] 5  3  6  7       31  3 [-1  -3  5] 3  6  7       51  3  -1 [-3  5  3] 6  7       51  3  -1  -3 [5  3  6] 7       61  3  -1  -3  5 [3  6  7]      7

示例 2:

输入:nums = [1], k = 1
输出:[1]

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104
  • 1 <= k <= nums.length

我们维护一个单调队列,队列的第一个元素是窗口的最大值,队列中只装有可能是最大值的数,同时保证队列里的元素数值是由大到小的。

   

思路:

维护一个单调队列 (队头到队尾依次减小),

push(int x): 将队列中小于x的全部弹出

pop(int x):x==队头元素,弹出x

peek():队头元素,也就是窗口最大值

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {//先将K个元素加入int[] result = new int[nums.length+1-k];int n=0;myQueue myQueue1= new myQueue();for(int i=0;i<k;i++){myQueue1.push(nums[i]);}result[n++]=myQueue1.peek();//移动窗口,i是窗口右部,for(int i=k;i<nums.length;i++){myQueue1.pop(nums[i-k]);myQueue1.push(nums[i]);  result[n++]=myQueue1.peek();}return result;}
}class myQueue{List<Integer> list;public myQueue(){list = new LinkedList<>();}public void push(int x){while(list.size()>0&&list.get(list.size()-1)<x){list.remove(list.size()-1);}list.add(x);}public void pop(int x){if(x==list.get(0)){list.remove(0);}}public int peek(){return list.get(0);}
}

347. 前 K 个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

提示:

  • 1 <= nums.length <= 105
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

思路:

本题与上一题不同,上一题只需要维护一个单调队列,不要求单调队列的长度,本题不仅需要维持单调,还要维持长度=k

  1. 要统计元素出现频率:使用map来进行统计
  2. 对频率排序:用一个size为k的优先级队列,用小顶堆实现,个数大于K时弹出最小值
  3. 找出前K个高频元素
class Solution {public int[] topKFrequent(int[] nums, int k) {//记录每个数出现的对应次数Map<Integer,Integer> map=new HashMap<>();for(int i=0;i<nums.length;i++){map.put(nums[i],map.getOrDefault(nums[i],0)+1);}//建立小顶堆PriorityQueue<int[]> priorityQueue = new PriorityQueue<>((a1, a2) -> a1[1] - a2[1]);//遍历mapfor (Map.Entry<Integer, Integer> entry : map.entrySet()){if(priorityQueue.size()<k){priorityQueue.add( new int[]{entry.getKey(), entry.getValue()});}else{if(priorityQueue.peek()[1]<entry.getValue()){priorityQueue.poll();//弹出队头,也就是最小值priorityQueue.add(new int[]{entry.getKey(), entry.getValue()});}}}
//结果按照次数多的排在前面int result[] = new int[priorityQueue.size()];int i=priorityQueue.size()-1;while(priorityQueue.size()>0){int temp =  priorityQueue.poll()[0];result[i--] = temp;}return result;}
}

 

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

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

相关文章

【C语言】字符串左旋(三种方法)

&#xff08;方法3只给出思路参考&#xff09; 问题 描述&#xff1a; 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 分析 我们先来理解一下&#xff0c;什么叫“左旋”&#xff1f;其实是这…

【数据库系统概论】函数依赖与范式

概述 在数据库设计中&#xff0c;范式&#xff08;Normal Forms, NF&#xff09;是用来规范化数据库表结构&#xff0c;以减少冗余数据和提高数据一致性与完整性的重要工具。 函数依赖 完全函数依赖与部分函数依赖 完全函数依赖 定义&#xff1a; 完全函数依赖表示的是在一…

开源项目介绍:Vision Pro上的棋盘游戏复刻——融合现实与虚拟的娱乐新体验

在探索Apple Vision Pro潜力的旅途中,一款精心打造的开源棋盘游戏复刻项目正吸引着众多开发者和游戏爱好者的目光。该项目不仅展示了混合现实技术的无限魅力,还为AVP(Apple Vision Pro)游戏领域的小白开发者们提供了一个理想的实践起点。让我们一起深入了解这个集创意与实用…

解决odbc 数据源创建之后删除失败问题

问题描述 该问题一般存在于用32位odbc管理程序删除了64位管理程序创建的数据源&#xff0c;被提示失败&#xff0c;然后再用64位odbc管理程序删除时发现删除不掉。怎么都删除不掉&#xff0c;不会影响体验&#xff0c;但是很膈应 问题解决 将该路径下的对应的ODBC数据源&…

低空经济面临的挑战

安全监管挑战。低空领域的安全问题是一个重要的挑战。低空飞行的航空器数量不断增加&#xff0c;这对空中交通管理和安全监管提出了更高的要求&#xff0c;如何确保低空飞行的安全&#xff0c;防范事故的发生&#xff0c;是亟待解决的问题。应加大对低空安全发展体系的构建研究…

使用Minikube+docker+harbor+k8s自动化部署 @by_TWJ

目录 1. 开始1.1. 环境1.2. 测试的git仓库1.3. 离线文件1.4. 安装docker1.5. 安装docker-compose&#xff08;非必要&#xff09;1.6. 安装Jenkins1.7. 安装harbor1.8. 允许docker通过http访问私有仓库1.9. 修改/etc/hosts&#xff0c;追加自定义域名1.10. 安装Minikube 2. min…

【Javascript系列】Terser通过调用API来实现代码的压缩和优化功能

Terser通过调用API来实现代码的压缩和优化功能 起源通过API来调用API调用过程中的一个隐含的技术点 - 异步调用和Promise对象官方文档中的一个有点容易忽略和混淆的地方关于Promise 起源 书接 上回&#xff0c;对Terser的功能做了一个初步的探索。在官方的主页上&#xff0c;有…

Windows系统电脑本地部署AI音乐创作工具并实现无公网IP远程使用

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统电脑上快速本地部署一个文字生成音乐的AI创作工具MusicGPT&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问使用。 MusicG…

SRE养成计划之03-用户与组权限(持续更新)

用户与组 概念 用户作用&#xff1a; 登陆操作系统方便做权限的不同设置用户的唯一标识&#xff1a;UIDLinux系统默认管理员root&#xff0c;管理员root的UID为0 组的作用 方便管理众多的用户&#xff0c;方便对用户进行分类 组的唯一标识&#xff1a;GID 组的分类&#xf…

22、matlab锯齿波、三角波、方波:rectpuls()函数/sawtooth()函数/square()函数

1、采样的非周期性矩形 语法 语法1&#xff1a;y rectpuls(t) 返回一个以数组 t 中指示的采样时间采样的连续非周期性单位高度矩形脉冲&#xff0c;该矩形脉冲以 t 0 为中心。 语法2&#xff1a;y rectpuls(t,w) 生成一个宽度为 w 的矩形 参数 t:采样时间 w:矩形宽度…

两步教你学会内网穿透

文章目录 1.下载安装ngrok安装包2.生成固定的域名3.访问 1.下载安装ngrok安装包 1.注册登录ngrok网站ngrok官网 页面下滑点击下载下载&#xff1a; 2.解压&#xff08;双击ngrok.exe进入终端&#xff09; 3.终端绑定账户信息&#xff08;复制如下图信息到终端&#xff09; …

力扣2379.得到k个黑块的最少涂色次数

力扣2379.得到k个黑块的最少涂色次数 i为右端点 class Solution {public:int minimumRecolors(string blocks, int k) {int w0;for(int i0;i<k;i){if(blocks[i] W) w;}int res w;for(int ik;i<blocks.size();i){w (blocks[i] W) - (blocks[i-k] W);res min(res,…

Win11下只支持IE浏览器的老网站顺畅运行的方法

在Windows 11操作系统中&#xff0c;由于Internet Explorer&#xff08;IE&#xff09;浏览器的逐步淘汰&#xff0c;微软官方已不再直接支持IE浏览器。然而&#xff0c;当您遇到必须访问仅支持IE的老旧网站时&#xff0c;Windows 11仍然提供了一些实用的替代方案来应对这一挑战…

前端加载,渲染十万条数据(性能优化)

1.场景 项目中某个弹窗展示设备信息卡片,返回的设备信息很多,页面样式有很花哨,导致渲染极其缓慢 f12,查看性能,这里可以看到页面加载在哪一步分耗时最长,针对性进行优化(图为举例) 2.解决思路 采用虚拟列表的方式,滚动时,dom元素数量不变,只改变展示的数据 结构描述: 父盒…

快速入门文件操作+5种例子演示

文件操作 基本操作注意事项例子1&#xff1a;读取文件内容例子2&#xff1a;写入文件内容例子3&#xff1a;追加文件内容例子4&#xff1a;读取并写入文件内容&#xff08;复制文件&#xff09;例子5&#xff1a;使用二进制模式读写文件 基本操作 在C语言中&#xff0c;使用文…

项目中统一异常处理

项目中统一异常处理 1.异常处理框架图2.实现 1.异常处理框架图 异常处理除了输出在日志中&#xff0c;还需要提示给用户&#xff0c;前端和后端需要作一些约定&#xff1a; 错误提示信息统一以json格式返回给前端。以HTTP状态码决定当前是否出错&#xff0c;非200为操作异常。…

在国内PMP含金量并不高?

PMP已经在全球194个国家和地区得到广泛认可&#xff0c;自1999年开始在国内实施。PMP被认为是项目管理专业身份的象征&#xff0c;是项目经理最重要的资质。获得PMP证书意味着个人的项目操作水平已经得到了PMI的认可&#xff0c;具备国际专业项目操作者水平&#xff0c;有资格专…

就凭这张图,下订华为享界S9

文 | Auto芯球 作者 | 雷慢 冲啦&#xff01;就在刚刚&#xff0c; 我们团队下订了一辆享界S9&#xff0c; 还琢磨买奔驰S级&#xff0c;宝马7系和奥迪A8的老板们&#xff0c; 是应该试试享界S9了&#xff0c; 至少先占个坑&#xff0c;8月底S9上市当天&#xff0c; 可以…

Linux 系统中的用户与用户组管理

Linux 系统中的用户与用户组管理 Linux系统是一个多用户多任务的分时操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员申请一个账号&#xff0c;然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行…

【vscode免密连接云服务器】

目录&#xff1a; 前言1.1 生成 SSH 密钥对1.2 将公钥复制到远程服务器1.3配置remote ssh 插件信息 总结 前言 剑指offer&#xff1a;一年又120天 1.1 生成 SSH 密钥对 在本地cmd命令窗口执行: ssh-keygen -t rsa会提示你设置生成密钥的文件、密码等等&#xff0c;可以一路回…