当前位置: 首页 > news >正文

算法通关村第十六关-黄金挑战滑动窗口与堆的结合

大家好我是苏麟 , 今天带来一道小题 .

滑动窗口最大值

描述 :

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

返回 滑动窗口中的最大值 

题目 :

LeetCode 239.滑动窗口最大值 :

239. 滑动窗口最大值

分析 :

这种方法我们在基础算法的堆部分介绍过。对于最大值、K个最大这种场景,优先队列(堆)是首先应该考虑的思路。大根堆可以帮助我们实时维护一系列元素中的最大值。


本题初始时,我们将数组 nums 的前 k个元素放入优先队列中。每当我们向右移动窗口时,我们就可以把一个新的元素放入优先队列中,此时堆顶的元素就是堆中所有元素的最大值。然而这个最大值可能并不在滑动窗口中,在这种情况下,这个值在数组 nums 中的位置出现在滑动窗口左边界的左侧。因此,当我们后续继续向右移动窗口时,这个值就永远不可能出现在滑动窗口中了,我们可以将其永久地从优先队列中移除。

我们不断地移除堆顶的元素,直到其确实出现在滑动窗口中。此时,堆顶元素就是滑动窗口中的最大值。为了方便判断堆顶元素与滑动窗口的位置关系,我们可以在优先队列中存储二元组(numindex),表示元素num 在数组中的下标为index。

解析 :

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;PriorityQueue<int[]> pq = new PriorityQueue<>(new Comparator<int[]>(){public int compare(int[] a,int[] b){return a[0] != b[0] ? b[0] - a[0] : b[1] - a[1];}});for(int i = 0;i< k; i++){pq.offer(new int[]{nums[i],i});}int[] arr = new int[n - k + 1];arr[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();}arr[i - k + 1] = pq.peek()[0];}return arr;}
}

这期就到这里 , 下期见!

http://www.lryc.cn/news/252652.html

相关文章:

  • 基于jsp的搜索引擎
  • 【Altium designer 20】
  • Proteus仿真--基于1602LCD与DS18B20设计的温度报警器
  • Clickhouse Join
  • Arduino驱动STS35数字温度传感器(温湿度传感器)
  • 一起学docker系列之十八Docker可视化工具 Portainer:简介与安装
  • 【数据结构】线段树
  • 王道数据结构课后代码题p175 06.已知一棵树的层次序列及每个结点的度,编写算法构造此树的孩子-兄弟链表。(c语言代码实现)
  • filter过滤器
  • MES物料的动态批次管理漫谈
  • 【爬虫逆向分析实战】某笔登录算法分析——本地替换分析法
  • vue3使用动态component
  • 单机游戏推荐:巨击大乱斗 GIGABASH 中文安装版
  • 计算机系统启动过程
  • DedeCms后台文章列表文档id吗?或者快速定位id编辑文章
  • 【开发问题解决方法记录】03.dian
  • QT之QString
  • 常见的几种计算机编码格式
  • 3D旋转tab图
  • openGL 三:矩阵和向量
  • Socket和Http的通讯原理,遇到攻击会受到哪些影响以及如何解决攻击问题。
  • 【springboot】整合redis
  • 回溯和分支算法
  • 深入理解:指针变量的解引用 与 加法运算
  • Docker 镜像构建的最佳做法
  • 工作上Redis安装及配置
  • 电商项目之Web实时消息推送(附源码)
  • 上机实验四 哈希表设计 西安石油大学数据结构
  • Ubuntu22.04 交叉编译mp4V2 for Rv1106
  • 缓存穿透、击穿、雪崩