算法通关村16关 | 堆与滑动窗口问题结合

news/2024/11/17 23:59:33/

1. 堆与滑动窗口问题结合

题目

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

思路

对于最大值、k个最大值这种场景,优先队列(堆)是首先应该考虑的思路。大根堆可以帮我们实时维护一系列中的最大值。

        把nums中前k个元素放入队中,作为初始值,第一个最大值就可以知道了,每次向右移动滑动窗口的时候,我们可以取出其中的最大值,当然最大值不一定在滑动窗口中的第一个元素,(如图中第6行第7行)因为窗口的大小固定,所以最多k-1次移动取出最大值,最少直接在首位取出,所以堆的大小其实是固定的,并不会太大,因为我们需要知道堆中元素在数组中的索引位置,索引存储二元数组(num,index)

整个过程大概就是边向右滑动边取出最大值的过程,当pq.peek()[1] <= i - k的时候,最大的元素是在窗口左端的左侧,在窗口外面,需要删除。

代码

    public int[] maxSlidingWindow(int[] nums, int k){int n = nums.length;PriorityQueue<int[]> pq = new PriorityQueue<>(new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {//正数单调递减return o1[0] != o2[0] ? o2[0] - o1[0] : o2[1] - o1[1];}});for (int i = 0; i < k; i++) {pq.offer(new int[]{nums[i],i});}int[] ans = new int[n - k + 1];//第一个最大值ans[0] = pq.peek()[0];for (int i = k; i < n; i++) {pq.offer(new int[]{nums[i],i});//判断最大值是否是窗口的第一个元素,是第一个元素因为窗口需要向前滑动,窗口大小固定,所以窗口中第一个元素需要移除while (pq.peek()[1] <= i - k){pq.poll();}ans[i - k + 1] = pq.peek()[0];}return ans;}


http://www.ppmy.cn/news/1096639.html

相关文章

Spire.xls+excel文件实现单据打印

报表和单据打印&#xff0c;通常都是使用fastreport之类的&#xff0c;因为有了现成的xls模板样式&#xff0c;如果转成fastreport那还需要花时间&#xff0c;是用spire.xls这个玩意简单&#xff0c;超好用。 一.引用 using Spire.Xls; 二.基本的操作 // 创建工作簿&#xff…

JavaScript中的原型链(prototype chain)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript中的原型链⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…

算法刷题记录-树(LeetCode)

783. Minimum Distance Between BST Nodes 思路(DFS 中序遍历) 考虑中序遍历的性质即可 代码 class Solution { public:int min_diffnumeric_limits<int>::max();int prevnumeric_limits<int>::min()100000;int minDiffInBST(TreeNode* root) {inorderTraversa…

【创新项目探索】大数据服务omnidata-hive-connector介绍

omnidata-hive-connector介绍 omnidata-hive-connector是一种将大数据组件Hive的算子下推到存储节点上的服务&#xff0c;从而实现近数据计算&#xff0c;减少网络带宽&#xff0c;提升Hive的查询性能。目前支持Hive on Tez。omnidata-hive-connector已在openEuler社区开源。 …

PY32F003F18串口函数

一、 PY32F003F18串口HAL库函数 HAL库函数本身写得很好&#xff0c;但非常难以理解。 1、PY32F003F18串口配置函数UART_SetConfig(UART_HandleTypeDef *huart) //函数功能:将UART_HandleTypeDef型结构变量写入"串口控制寄存器" static void UART_SetConfig(UART_H…

Linux学习之基础工具一

1.Linux 软件包管理器 yum 首先我们需要知道的是在Linux下&#xff0c;现存的软件和指令是一定的&#xff0c;而有的时候我们想需要更多的指令或者软件&#xff0c;而这在Linux本身下是没有的&#xff0c;故我们可以利用指令yum指令安装或卸载你想要或者不需要的软件&#xff…

gitlab 合并分支

打开我们的gitlab&#xff0c;找到我们的项目&#xff0c;在左侧菜单中找到Merge requests&#xff0c;点击Merge requests&#xff0c;进入下一个页面 点击New merge requests&#xff0c;创建一个新的merge&#xff0c;进入下一个页面 选择自己分支和目标分支&#xff0c;自己…

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…