算法通关村 —— 滑动窗口与堆结合

堆与滑动窗口问题的结合

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

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

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

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

我们不断地移除堆顶的元素直到其确实在滑动窗口中。此时,堆顶元素就是滑动窗口中的最大值。

为了方便判断堆顶元素与滑动窗口的位置关系,我们可以在优先队列中存储二元组(num,index),表示元素 num 在数组中的下标为 index。

public class MaxSlidingWindow {public static int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;// 定义最大堆(优先队列),比较的是num值,num值相等再比较索引PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>() {public int compare(int[] pair1, int[] pair2) {return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];}});// 先入堆k个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;}// 测试public static void main(String[] args) {int[] nums = {1, 3, -1, -3, 5, 3, 6, 7};int k = 3;int[] result = maxSlidingWindow(nums, k);System.out.println(Arrays.toString(result));}}

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

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

相关文章

嵌入式linux常用的文件传输方式

做嵌入式就避免不了移植工作&#xff0c;所谓移植就是将交叉编译生成的可执行程序&#xff0c;库&#xff0c;配置文件等传输到开发板上进行工作。 常用传输方式有以下几种&#xff1a;1.串口传输 就是使用串口传输工具rz/sz; 该工具通过串口传输在SRT串口工具…

什么是用户体验测试? 为什么很重要?

在当今数字化时代&#xff0c;用户体验(User Experience&#xff0c;简称UX)已经成为产品成功的关键因素之一。无论是应用程序、网站、硬件设备还是软件&#xff0c;提供出色的用户体验不仅能够吸引更多用户&#xff0c;还能够增加用户满意度&#xff0c;提高品牌忠诚度&#x…

残差网络ResNet

残差网络的提出,是为了解决深度学习中的退化问题。 退化问题指的是随着神经网络层数的增加&#xff0c;网络性能反而逐渐降低的现象。换句话说&#xff0c;当我们不断增加神经网络的层数时&#xff0c;神经网络的训练误差可能会持续下降&#xff0c;但是验证集误差却不断增加&…

前端项目 index.html 中发请求 fetch

想要在前端项目 index.html文件中向后端发起请求&#xff0c;但是引入axios报错&#xff08;我这边会报错&#xff09;&#xff0c;可以使用fetch。 //window.location.origin----获取域名&#xff0c;包括协议、主机号、端口号fetch(window.location.origin "/api/pla…

MPLAB X IDE 仿真打断点提示已中断的断点?

这种中间带裂缝的是无效断点。 原因可能与XC编译器的优化有关&#xff0c;最后生成的汇编与C语言并不是一一对应的(官方给的解释是效率高)。所以这一行C语言转换的汇编代码可能并不在这个位置&#xff0c;也可能与其它汇编合并后根本就没有 我的解决方法是把优化等级调到最低&a…

Flink 统计接入的数据量-滚动窗口和状态的使用

1、概述 在生产场景值&#xff0c;经常需要和上游、下游对数&#xff0c;离线场景可以直接 group by 再 count &#xff0c;但是实时场景中&#xff0c;如果使用 kafka 作为中间件&#xff0c;中间经过几个 job 的过滤转化后&#xff0c;再对照像 Doris 或 Clickhouse 中最终层…

2014年亚太杯APMCM数学建模大赛A题无人机创造安全环境求解全过程文档及程序

2014年亚太杯APMCM数学建模大赛 A题 无人机创造安全环境 原题再现 20 国集团&#xff0c;又称 G20&#xff0c;是一个国际经济合作论坛。2016 年第 11 届 20 国集团峰会将在中国召开&#xff0c;这是继 APEC 后中国将举办的另一个大型峰会。此类大型峰会&#xff0c;举办城市…

prometheus服务发现

Consul简介 ◼ 一款基于golang开发的开源工具&#xff0c;主要面向分布式&#xff0c;服务化的系统提供服务注册、服务发现和配置管理 的功能 ◼ 提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能 部署 curl -LO https://releases.hashicorp…

保障效率与可用,分析Kafka的消费者组与Rebalance机制

系列文章目录 上手第一关&#xff0c;手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么&#xff0c;以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析&#xff0c;打破面试难关 防止消息丢失与消息重复——Kafka可…

opengl基础笔记1

1、opengl运行模式及opengl规范 运行模式&#xff1a;核心模式与立即渲染模式&#xff08;弃用&#xff09; 由于OpenGL的大多数实现都是由显卡厂商编写的&#xff0c;当产生一个bug时通常可以通过升级显卡驱动来解决。这些驱动会包括你的显卡能支持的最新版本的OpenGL&#xf…

YOLOv8将注意力机制融合进入C2f模块

1. 引言 1.1 YOLOv8添加注意力机制方法 yolov8添加注意力机制是一个非常常见的操作&#xff0c;常见的操作直接将注意力机制添加至YOLOv8的某一层之后&#xff0c;这种改进特别常见。 示例如下&#xff1a; 新版yolov8添加注意力机制&#xff08;以NAMAttention注意力机制为例…

10.windows系统:定时任务备份mysql数据库

1. 创建脚本 .bat内容如下&#xff1a; echo off ::设置编码格式utf-8否则有中文乱码 chcp 65001 echo. echo MySQL数据库开始备份echo ***************************** echo. echo 备份日期&#xff1a;%date% echo 备份时间&#xff1a;%time% echo. echo *****************…

鸿蒙问题记录

1、Variables decorated by Prop link, "Consume, and Obiectlink cannot be initialized locally 原因&#xff1a;被装饰器修饰的数据&#xff0c;不能初始化。这个应该是后续版本做了优化。当前使用 DevEco Studio 3.1.1 Release

Web3时代:探索DAO的未来之路

Web3 的兴起不仅代表着技术进步&#xff0c;更是对人类协作、创新和价值塑造方式的一次重大思考。在 Web3 时代&#xff0c;社区不再仅仅是共同兴趣的聚集点&#xff0c;而变成了一个价值交流和创新的平台。 去中心化&#xff1a;超越技术的革命 去中心化不仅仅是 Web3 的技术…

CRM系统如何帮助企业实现管理信息化?

21世纪的今天&#xff0c;企业不重视CRM信息化会导致什么后果&#xff1f;我们先来看这个例子—— 假设有一家中小型电子商务公司&#xff0c;他们销售各种电子产品&#xff0c;如手机、平板、电脑和配件等。在开始使用CRM系统之前&#xff0c;他们的客户数据分散在各个部门的…

Redis高可用解决方案之Redis集群,和Spring Cloud集成实战

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

HDFS集群环境部署(超级详细!!)

一、部署Hadoop的关键点 1.上传&#xff0c;解压到/export/server,配置软链接 2.修改4个配置文件&#xff0c;workers&#xff0c;hadoop.env.sh&#xff0c;core-stie.xml&#xff0c;hdfs-site.xml 3.SCP分发到root2,root3&#xff0c;并设置环境变量 4.创建数据目录,并修改文…

TypeScript 中for in遍历,元素隐式具有 “any“ 类型,因为类型为 “string“ 的表达式不能用于索引类型

第一种方案、使用[key: string]&#xff1a;string 形式为键名声明类型 声明类型&#xff1a; interface FormInfoData {[materialCode: string]: stringmaterialName: stringmaterialUnit: stringmaterialItem: stringmaterialOwnership: stringmaterialclassCode: stringmat…

Mac pro解压rar文件

unrar 已经从homebrew移除了&#xff01;&#xff01; 在 MacOS 上解压 rar 文件&#xff0c;需要使用一个支持 rar 格式的第三方工具。有很多工具可以选择&#xff0c;但我会推荐一个名为 "Unarchiver" 的免费工具&#xff0c;它支持许多不同类型的压缩文件&#x…

diffusers-Load adapters

https://huggingface.co/docs/diffusers/main/en/using-diffusers/loading_adaptershttps://huggingface.co/docs/diffusers/main/en/using-diffusers/loading_adapters 有几种训练技术可以个性化扩散模型&#xff0c;生成特定主题的图像或某些风格的图像。每种训练方法都会产…