滑动窗口最大值(力扣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…

18、BLIP

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

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

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

西电期末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&…

【已解决】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 :…

Springcloud 微服务实战笔记 Ribbon

使用 Configurationpublic class CustomConfiguration {BeanLoadBalanced // 开启负载均衡能力public RestTemplate restTemplate() {return new RestTemplate();}}可看到使用Ribbon&#xff0c;非常简单&#xff0c;只需将LoadBalanced注解加在RestTemplate的Bean上&#xff0…

视频通话录制 方案 教程

一些基本概要 1 市面流行的音视频产品&#xff0c;都包含一对一、一对多、多对多通话&#xff0c;云端录制等这些基本功能&#xff0c;有些厂商支持本地服务录制。 2 本地服务录制&#xff0c;云端录制区别 两个录制区别在于&#xff0c;本地服务端录制的 SDK 要求部署在 …

【Proteus仿真】【Arduino单片机】电蒸锅温度控制系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用LCD1602液晶、按键开关、蜂鸣器、DS18B20温度传感器&#xff0c;液位传感器、继电器控制加热保温装置等。 主要功能&#xff1a; 系统运行后&…

C++-模板与容器

1、模板 模板可以让类或者函数支持一种通用类型&#xff0c;这种通用类型在实际运行过程中可以使用任何数据类型。因此程序员可以写出一些与类型无关的代码。这种编程方式也叫“泛型编程”。 通常有两种形式&#xff1a; 函数模板类模板 1.1 函数模板 //模板类型声明 template&…

中文自然语言处理库(SnowNLP)的简单使用

snownlp 是一个简单易用的 Python 库&#xff0c;专为处理中文文本而设计。它基于自然语言处理技术&#xff0c;提供了多种功能&#xff0c;包括分词、词性标注、情感分析、文本转换&#xff08;简繁转换&#xff09;等。这个库的核心优势在于对中文文本的处理能力&#xff0c;…

Navicat 技术干货 | 聚合查询的介绍

基础 SQL 查询可以检索、插入、更新和删除记录&#xff0c;而聚合查询可通过提供求和、平均值或最大/最小值等的大型结果集&#xff0c;将数据库交互提升到一个新的水平。本文中&#xff0c;我们将探索聚合 SQL 查询的基础知识&#xff0c;并研究如何有效的利用他们来分析和汇总…

14.1 Linux 并发与竞争

一、并发与竞争 并发&#xff1a;多个执行单元同时、并行执行。 竞争&#xff1a;并发的执行单元同时访问共享资源(硬件资源和软件上的全局变量等)易导致竞态。 二、原子操作 1. 原子操作简介 原子操作&#xff1a;不能再进一步分割的操作&#xff0c;一般用于变量或位操作。 …