滑动窗口最大值(力扣239题)

单调递减队列:

在解决题目之前,我们先来了解一下单调递减队列,它其实就是在队列的基础上多加了一些限制,如下图:

          要求队列中的元素必须按从大到小的顺序排列

如果向单调递减队列中加入数字 1,可以直接加入,不会改变队列中递减的要求。

但是向队列中加入数字 3 就不能直接加入了。需要把队列中的 2,1 移除,然后再加入 3。  

我们可以利用java中自带的LinkedList双端队列来实现一下单调递减队列。

import java.util.LinkedList;//单调递减队列
public class MonotonicQueue<T extends Comparable<T>> {private final LinkedList<T> queue = new LinkedList<>();public T peek(){return queue.peekFirst();}public void poll(){queue.pollFirst();}public void offer(T t){while(!queue.isEmpty() && queue.peekLast().compareTo(t) < 0){queue.pollLast();}queue.offerLast(t);}@Overridepublic String toString() {return queue.toString();}public static void main(String[] args) {MonotonicQueue<Integer> q = new MonotonicQueue<>();for(int i : new int[]{1, 3, -1, -3, 5, 3, 6, 7}){q.offer(i);System.out.println(q);}}
}

接下来我们用单调递减队列来解决力扣的一道题目

例题:

分析:

题目说了,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。假设滑动窗口的大小 k = 3,每次窗口右移,找出滑动窗口里的最大值并把它填入一个新数组中(滑动窗口必须被填满


我们可以使用单调递减队列来找到滑动窗口中的最大值,每次向单调递减队列加入元素,队列的队头元素就是滑动窗口里面的最大值。如下图(从左往右看)。

注意:只有当滑动窗口被填满时,才获取窗口里面的最大值。

有一种情况需要注意,如下图:

当队列中的元素超过滑动窗口的范围( k ),要及时把队头元素移除。

这里可以利用索引,当遍历到第 i 个索引时,i - k 处的元素就是过期的元素,应该移除。

也就是满足了 nums[i - k] == queue.peek() ,则移除队头元素。

注意:这里不能用队列大小当判断条件,当队列长度大于窗口大小(k)就移除元素,这样做可能会出问题。

如果把上图中的数字 -4 改为 1,当往队列加入1时,会把前面的-1,-3覆盖掉,此时队列长度小于滑动窗口值,用单调递减队列找到的最大值(数字3) 其实是过期的。

显然,此时滑动窗口的最大值为1。

代码实现:
package leetcode;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class SlidingWindowMaxnum {public static int[] maxSlidingWindow(int[] nums, int k) {//创建单调递减队列MonotonicQueue<Integer> queue = new MonotonicQueue<>();List<Integer> list = new ArrayList<>();for (int i = 0; i < nums.length; i++) {//检查队列头部元素,超过滑动窗口范围要移除if(i >= k && nums[i - k] == queue.peek()){queue.poll();}int num = nums[i];queue.offer(num);if(i >= k - 1){list.add(queue.peek());}}return list.stream().mapToInt(Integer::intValue).toArray();}public static void main(String[] args) {System.out.println(Arrays.toString(maxSlidingWindow(new int[]{1, 3, -1, -3, 5, 3, 6, 7}, 3))); //[3, 3, 5, 5, 6, 7]//System.out.println(Arrays.toString(maxSlidingWindow(new int[]{7, 2, 4}, 2))); // [7, 4]//System.out.println(Arrays.toString(maxSlidingWindow(new int[]{1, 3, 1, 2, 0, 5}, 3))); // [3, 3, 2, 5]//System.out.println(Arrays.toString(maxSlidingWindow(new int[]{-7, -8, 7, 5, 7, 1, 6, 0}, 4))); // [7, 7, 7, 7, 7]}
}

可以把上面的集合换成数组,做一个小小的优化,放到力扣上跑会更好。

public static int[] maxSlidingWindow(int[] nums, int k) {MonotonicQueue<Integer> q = new MonotonicQueue<>();int[] output = new int[nums.length - (k - 1)];for (int i = 0; i < nums.length; i++) {if (i >= k && nums[i - k] == q.peek()) {q.poll();}int num = nums[i];q.offer(num);if (i >= k - 1) {output[i - (k - 1)] = q.peek();}}return output;}

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

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

相关文章

一起玩儿物联网人工智能小车(ESP32)——25. 利用超声波传感器测量距离

摘要&#xff1a;本文介绍如何利用超声波传感器测量障碍物的距离 测量距离是智能小车经常要用到的功能&#xff0c;今天就来介绍一个最常用的测量距离的传感器——超声波传感器。 超声波传感器的测距原理是利用超声波发射器向某个方向发射超声波&#xff0c;与此同时&#xff…

【Emgu.CV教程】第22篇 、色彩处理之ApplyColorMap()伪色彩应用

这篇文章讲的内容比较轻松&#xff0c;技术含量比较低。从我个人的角度讲&#xff0c;ApplyColorMap()函数实现了类似PhotoShop的一些酷炫效果&#xff0c;既把原始彩色图转换为21种风格各异的彩色图像&#xff0c;比如秋天风格、热力图风格等等&#xff0c;但是&#xff0c;在…

【Java期末】学生成绩管理系统

诚接计算机专业编程任务(C语言、C、Python、Java、HTML、JavaScript、Vue等)10/15R&#xff0c;如有需要请私信我&#xff0c;或者加我的企鹅号&#xff1a;1404293476 本文资源下载地址&#xff1a;https://download.csdn.net/download/weixin_47040861/88697244 —————…

Win11/10家庭版升专业版/企业版

2024.1.4 下载地址&#xff1a;HEU_KMS_Activator GitHubhttps://github.com/zbezj/HEU_KMS_Activator/tags 下载最新版即可 &#xff08;升级时需要断网&#xff09;打开程序 --> 其他 --> 选择professional --> 在点击四叶草图标即可 升级完后再次打开软件 -->…

Kali Linux实现UEFI和传统BIOS(Legacy)引导启动

默认Kali linux安装会根据当前启动的引导模式进行安装 例&#xff1a;以UEFI引导启动安装程序&#xff0c;安装后仅能在UEFI引导模式下进入系统 安装Kali系统 这边基于VirtualBox虚拟机镜像实战操作 首先创建一个Kali虚拟机 这里需要注意&#xff0c;把启动 EFI (只针对某些操…

Vue v-html中内容图片过大自适应处理

之前图片如下&#xff0c;图片已经超出了页面的展示范围 对v-html增加样式处理 <div class"body padding-l scroll " v-html"docData.content"> </div><style scoped>.body >>> img {max-width: 100% ;} </style>…

CCNP课程实验-04-BGP_CFG

目录 实验条件网络拓朴 基础配置需求实现IGP部分1. 按照图示配置OSPF区域&#xff0c;RID为Loopback 0地址。其中Area 146要配置为OSPF的特殊区域。2. 配置其它路由协议&#xff0c;重分布使得路由互相注入&#xff0c;实现全网互通。3. R1配置策略路由&#xff0c;使得R2经R1去…

Vue 框架前导:详解 Ajax

Ajax Ajax 是异步的 JavaScript 和 XML。简单来说就是使用 XMLHttpRequest 对象和服务器通信。可以使用 JSON、XML、HTML 和 text 文本格式来发送和接收数据。具有异步的特性&#xff0c;可在不刷新页面的情况下实现和服务器的通信&#xff0c;交换数据或者更新页面 01. 体验 A…

算法分析与设计 第六次理论作业

算法分析与设计 第六次理论作业 文章目录 算法分析与设计 第六次理论作业一. 单选题&#xff08;共4题&#xff0c;50分&#xff09;二. 填空题&#xff08;共3题&#xff0c;37.5分&#xff09;三. 简答题&#xff08;共1题&#xff0c;12.5分&#xff09; 一. 单选题&#xf…

Spring MVC之HandlerAdapter

1. 前言 Spring MVC没有限制Handler的类型&#xff0c;Handler可以以任何形式存在&#xff0c;内置的Handler就有四种类型&#xff1a; HandlerMethodControllerHttpRequestHandlerServlet 开发者还可以自定义Handler&#xff0c;面对各种各样类型的Handler&#xff0c;Spri…

18、BLIP

简介 github BLIP提出了一种基于预训练的方法&#xff0c;通过联合训练视觉和语言模型来提升多模态任务的性能。 BLIP(Bootstrapping Language-Image Pretraining)是salesforce在2022年提出的多模态框架&#xff0c;是理解和生成的统一&#xff0c;引入了跨模态的编码器和解码…

Linux嵌入式配置/etc/profile文件

Linux嵌入式配置/etc/profile文件 void mountMouse() {QFile profile("/etc/profile");if (profile.exists()) {if (profile.open(QIODevice::ReadWrite)) {QByteArray fileData(profile.readAll());if (!fileData.contains("tslib:/dev/input/event0 intellim…

词嵌入位置编码的实现(基于pytorch)

背景介绍 在transformers架构当中&#xff0c;对于词向量的输入需要加上原本词对应的位置信息&#xff0c;作为输入到模型中训练的input&#xff0c;那具体的位置编码如何实现呢&#xff1f;本篇博客就跟大家一起分享一下对应的步骤 位置编码的公式 对于词向量的位置编码的方…

数据结构复杂

顺序存储与链式存储优缺点 顺序存储&#xff1a; 优点&#xff1a; 顺序存储结构利用一段连续的存储单元依次存储线性表的数据元素&#xff0c;使得线性表的数据元素在内存中是紧凑排列的&#xff0c;从而减少了存取时间。顺序存储结构在内存中占用的空间是连续的&#xff0c…

十进制转二进制、八进制、十

❤ 厾罗 十进制转二进制、八进制、十 以下代码用于实现十进制转二进制、八进制、十六进制&#xff1a; 实例(Python 3.0) # -*- coding: UTF-8 -*- # Filename : test.py # author by : www.dida100.com # 获取用户输入十进制数 dec int(input("输入数字&…

西电期末1017.有序序列插值

一.题目 二.分析与思路 简单题。主要考察简单的排序&#xff0c;最后的插入数据同样不用具体实现&#xff0c;只需在输出时多输出一下即可&#xff0c;注意顺序&#xff01;&#xff01; 三.代码实现 #include<bits/stdc.h>//万能头 int main() {int n;scanf("%d…

HTML5+CSS3+Vue小实例:彩色圆环溶解加载动画

实例:彩色圆环溶解加载动画 技术栈:HTML+CSS+Vue.js 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge&…

95 快慢指针解决环形链表

问题描述&#xff1a;给定一个链表&#xff0c;判断表中是否有环&#xff0c;为了表示给定链表中的环&#xff0c;我们使用整数pos来表示链表尾链接到链表中的位置&#xff0c;如果pos是-1表示没有环。 快慢指针求解&#xff1a;定义一个慢指针和一个快指针&#xff0c;若两者…

【已解决】Invalid bound statement (not found)

报错讯息 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.casey.mapper.SysRoleMapper.getUserRoleCode at org.apache.ibatis.binding.MapperMethod S q l C o m m a n d . < i n i t > ( M a p p e r M e t h o d . j a v a :…

springboot整合websocket实现聊天室对话

要实现Spring Boot整合WebSocket实现聊天室对话&#xff0c;你需要遵循以下步骤&#xff1a; 1. 添加依赖 在你的pom.xml文件中添加以下依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…