Java 滑动窗口最大值的实现
作者:南淮北安 发布时间:2021-09-10 15:34:20
标签:Java,滑动窗口最大值
一、题目
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
二、单调队列解析
题目让求随着滑动窗口的滑动,返回窗口覆盖范围的最大值
该题不适合优先级队列,因为采用大顶堆存放k个数字,可以知道此时的最大值,但是窗口是滑动的,大顶堆每次只能弹出最大值,无法移除其他值,即无法用大顶堆维护滑动窗口里的值。
所以采用队列维护,随着窗口的移动,队列先进先出
此时对队列的要求是,队列首位为最大值,整个队列呈递减
例如:1,3,-1,-3,5,3,6,7
初始:1,3,-1,队列存入3,-1,使其保持递减,且首位为此时滑动窗口的最大值
移动到-3,队列:3,-1,-3
移动到5,队列:5
移动到3,队列:5,3
移动到6,队列:6
移动到7,队列:7
所以为了满足要求,需要自定义队列
从示例可以看出,队列没必要维护窗口里所有元素,只需要保证队列首位此时窗口的最大,而且,队列元素为递减,具体看代码
三、代码
import java.util.Deque;
import java.util.LinkedList;
//自定义数组
class MyQueue {
Deque<Integer> deque = new LinkedList<>();
//弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出
//同时判断队列当前是否为空
void poll(int val) {
if (!deque.isEmpty() && val == deque.peek()) {
deque.poll();
}
}
//添加元素时,如果要添加的元素大于入口处的元素,就将入口元素弹出
//保证队列元素单调递减
//比如此时队列元素3,1,2将要入队,比1大,所以1弹出,此时队列:3,2
void add(int val) {
while (!deque.isEmpty() && val > deque.getLast()) {
deque.removeLast();
}
deque.add(val);
}
//队列队顶元素始终为最大值
int peek() {
return deque.peek();
}
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums.length == 1) {
return nums;
}
int len = nums.length - k + 1;
//存放结果元素的数组
int[] res = new int[len];
int num = 0;
//自定义队列
MyQueue myQueue = new MyQueue();
//先将前k的元素放入队列
for (int i = 0; i < k; i++) {
myQueue.add(nums[i]);
}
res[num++] = myQueue.peek();
for (int i = k; i < nums.length; i++) {
//滑动窗口移除最前面的元素,移除是判断该元素是否放入队列
myQueue.poll(nums[i - k]);
//滑动窗口加入最后面的元素
myQueue.add(nums[i]);
//记录对应的最大值
res[num++] = myQueue.peek();
}
return res;
}
}
四、总结
该题利用了单调队列,需要自己定义入队出队规则
入队:保持队首元素始终最大,同时队内维护窗口的大小个元素,呈现递减
出队:判断当前元素是否入队,在队内,再随着窗口的滑动执行出队操作
来源:https://blog.csdn.net/nanhuaibeian/article/details/117047732


猜你喜欢
- 我们在使用SpringData JPA框架时,进行条件查询,如果是固定条件的查询,我们可以使用符合框架规则的自定义方法以及@Query注解实
- 一、下载步骤首先明确自己的操作系统下载地址:点击跳转进入界面后我们可以看到有ultimate版本(收费)和community版本(免费),学
- 有段时间没有写博客了,也在努力的从传统单机开发向分布式系统过度,所以再次做一些笔记,以方便日后查看。直接进入正题吧,今天记录spring-b
- 本文实例为大家分享了unity实现场景切换进度条显示的具体代码,供大家参考,具体内容如下一、UI。建立slider适当更改即可;二、新增lo
- 本文主要探究的是关于Bean的作用域、生命周期的相关内容,具体如下。Bean的作用域Spring 3中为Bean定义了5中作用域,分别为si
- 一、遇到一个问题1、读取CSV文件package com.guor.demo.charset;import java.io.Buffered
- java 打造阻塞式线程池的实例详解原来以为tiger已经自带了这种线程池,就是在任务数量超出时能够阻塞住投放任务的线程,主要想用在JMS消
- 使用工具:Android studio 3.0使用方法:一:在build.gradle(Module:app)中添加依赖implementa
- 1 前言到目前为止Java仍然是使用最多的编程语言,随着Java以及Java社区的不断壮大,Java也早已不再是简简单单的一门计算机语言了,
- 参考 java查找无向连通图中两点间所有路径的算法,对代码进行了部分修改,并编写了测试用例。算法要求:1. 在一个无向连通图中求出
- 下标到指针之间和转换以下的程序做了什么。#include <stdio.h> int main() { int a
- 目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel直接上代码:一,POIPOI是apa
- 主要讲解Android Studio中生成aar文件以及本地方式使用aar文件的方法,具体内容详情如下所示:在Android Studio中
- 本文实例讲述了Android TextView中文字通过SpannableString设置属性的方法。分享给大家供大家参考,具体如下:在An
- 前言最近开发了一个接口,完成后准备自测时,却被 * 拦截了,提示:(AUTH-NO)未能获得有效的请求参数!怎么会这样呢?于是我全局搜了这个
- 一、Maven简介1. 什么是MavenMaven:是Apache提供的免费开源的项目管理工具。它提供了一个项目对象模型(pom.xml)、
- 本文实例讲述了Android判断Activity是否在最上层的方法。分享给大家供大家参考,具体如下:private boolean isTo
- 一、加密介绍本文采用对称式加密算法DES和非对称式加密算法RSA结合做数据传输加密的方式。先说一下对称式加密 DES:对称式加密即使用单钥密
- 导入Jstl标签库<%@ taglib uri="http://java.sun.com/jsp/jstl/core&quo
- 使用multipart/form-data方式提交数据与普通的post方式有一定区别。multipart/form-data的请求头必须包含