java数据结构与算法刷题-----LeetCode239. 滑动窗口最大值

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

在这里插入图片描述

1. 法一:指针法

解题思路
  1. 我们以每一个窗口来看,找到每个窗口的最大值
  2. 那么找到最大值后,会面临一些情况。就是窗口滑动后,会从左边少一个元素,右边多一个元素
  3. 首先,如果右边多出来的,比当前最大值大的话,那它一定是新的最大值。因为上一次窗口中最大为max。而新加了一个右边的,比max大,那么右边这个就是最大的
  4. 如果右边的没有当前max大。那么就考虑左边,如果左边少了一个后,新的最左边结点和max一样,那么左边这个就是新最大值
  5. 如果刚好,上一次的max,在滑动窗口后,不在窗口范围了,那么没办法,只能遍历窗口元素,找到新的最大值
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
代码:时间复杂度O(n),空间复杂度O(1)

在这里插入图片描述

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int left = 0;//滑动窗口左边界int right = k - 1;//滑动从窗口右边界int maxIndex = -1;//max元素下标int max = Integer.MIN_VALUE;//max - 1 = Integ.MAX_VALUE;int[] res = new int[nums.length - k + 1];//结果数组while (right < nums.length) {//还可以滑动就继续if (maxIndex > left) {//如果max在left右边if (nums[right] > max - 1) {//判断是否新添加元素>maxmaxIndex = right;//如果right新元素>max就让max指向rightmax = nums[maxIndex];}} else if (nums[right] > max - 1) {//如果max不在left右边,但是新添加元素,刚好>maxmaxIndex = right;//那么right一定新窗口是最大值,因为max是旧窗口的最大值max = nums[maxIndex];}else if (nums[left] >= max - 1 ) {//如果max不在left右边,而且right不是最大值,那么看看left是否是最大值maxIndex = left;//区域减少了一个值,添加一个right,right不是最大值,那就看看left是不是最大值max = nums[left];//是,就让max指向left}else {//上面条件都不成立,最大值既不是right也不是left,而是在中间的话。就只能循环找了maxIndex = left;max = nums[maxIndex];for (int i = left + 1; i <= right; i++) {if (nums[i] > max - 1) {maxIndex = i;max = nums[maxIndex];}}}res[left] = max;//每次都保存最大值left++;//滑动窗格right++;//滑动窗格}return res;}
}

2. 法二:单调队列

解题思路
  1. 每一个元素的下标都会从右端插入队列
  2. 如果插入时,队列前面的元素小于当前插入元素。说明它们不会是当前窗口最大值,我们将前面比它小的取出。然后插入当前元素
  3. 因为每次我们都将前面较小的去除了,所以最左边的元素永远是当前最大的。
  4. 但是最左边的这个下标,如果不是当前窗口范围内的下标,就先去除。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
代码:时间复杂度O(n),空间复杂度O(n)

在这里插入图片描述

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;Deque<Integer> deque = new LinkedList<Integer>();//单调队列保存下标 first <--|  队列  |--> last//处理第一个窗口for (int i = 0; i < k; ++i) {//将k个元素的下标放入单调队列//如果队列不为空,新元素比前面的元素大,就将前面比它小的元素取出while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {deque.pollLast();//将前面小的取出}deque.offerLast(i);//将当前值的下标放入队列,保证它前面都是值比它大的下标}int[] ans = new int[n - k + 1];//答案数组,需要n-k+1个答案,也就是一共n-k+1个窗口ans[0] = nums[deque.peekFirst()];//将刚刚处理的第一个窗口结果放入ans[0]//处理剩下的窗口for (int i = k; i < n; ++i) {//如果队列不为空,新元素比前面的元素大,就将前面比它小的元素取出while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {deque.pollLast();//将前面小的取出}deque.offerLast(i);//将当前值的下标放入队列,保证它前面都是值比它大的下标while (deque.peekFirst() <= i - k) {//如果左边界的下标已经不在当前窗口内deque.pollFirst();//将其出队列}ans[i - k + 1] = nums[deque.peekFirst()];//因为我们一直都只保留大的值,所以first就是当前窗口最大值}return ans;}
}

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

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

相关文章

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(二)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

【软考中级备考笔记】数据的表示和校验码

2024/2/18 – 数据的表示和校验码 天气&#xff1a;阴雨 春节假期结束后第一个工作日&#xff0c;开始备考中级软件工程师。 希望在今年5月底的软考中取得中级证书 视频地址&#xff1a;https://www.bilibili.com/video/BV1Qc411G7fB 1. 计算机的总体架构 从下图中可以看出&am…

三防平板丨平板终端丨加固平板丨户外勘测应用

随着科技的不断发展&#xff0c;现代勘测业也在不断升级。相较于传统的勘测设备&#xff0c;三防平板在户外勘测中有着广泛的应用。那么&#xff0c;三防平板在户外勘测中究竟有哪些优势呢&#xff1f; 首先&#xff0c;三防平板具备极强的防水、防尘、防摔能力。在野外勘测中&…

应用管理中心架构的设计与实现

应用管理中心在现代软件开发中扮演着重要角色&#xff0c;它能够帮助开发团队有效管理和监控各种应用的运行情况。本文将介绍如何设计和实现一个高效、可靠的应用管理中心架构&#xff0c;以提升开发团队的工作效率和系统稳定性。 1. 架构概述 - 介绍应用管理中心的整体架构…

大页内存配置引发的数据库性能问题

问题背景: 用户来电报故障&#xff0c;他们一套正常运行的Oracle数据库&#xff0c;突然出现了10分钟左右的性能卡顿问题&#xff0c;期间全部的业务操作都变慢&#xff0c;他们通过查看问题期间的awr报告&#xff0c;发现数据库在问题时间出现大量的libary cache等待事件&…

金蝶K3-WISE与黑湖MES对接集成查询销售订单打通导入销售订单

金蝶K3-WISE与黑湖MES对接集成查询销售订单打通导入销售订单 接入系统&#xff1a;金蝶K3-WISE 金蝶K/3WISE是一款面向成长型企业&#xff0c;适应企业在快速成长过程中业务与管理的不断变化的信息化平台&#xff0c;实现云服务、ERP、物联网的融合&#xff0c;帮助企业从信息化…

每天分享一个Python库-Chardet

每天分享一个Python库-Chardet 前言 Python中有许多好用、有意思的库&#xff0c;有一些可以大大提高开发效率&#xff0c;有的可以为我们解决很多棘手的问题&#xff0c;从今天开始我会每天给大家分享一个Python库。今天分享的是一个跟字符串编码有关的库—chardet Chardet…

C++面试宝典第29题:sizeof使用大全

题目 给出下面代码的输出值。 #include <iostream> #include <string> using namespace std;#define PRINT_SIZEOF(a) printf("sizeof("#a##") = %u\n", (unsigned int)sizeof(a)) #define PRINT_STRLEN(a) printf("strlen(&q…

基于51/STM32单片机的智能药盒 物联网定时吃药 药品分类

功能介绍 以51/STM32单片机作为主控系统&#xff1b; LCD1602液晶显示当前时间、温湿度、药品重量 3次吃药时间、药品类目和药品数量 HX711压力采集当前药品重量 红外感应当前药盒是否打开 DS1302时钟芯片显示当前年月日、时分秒、星期 DHT11采集当前环境温度和湿度 …

Nginx错误502 Bad Gateway

使用Nginx配置的反向代理&#xff0c;浏览器访问的时候出现 “502 Bad Gateway” 错误&#xff0c;检查了一下后台error文件&#xff0c;发现有类似下面的错误 2024/02/05 14:21:00 [error] 166605#166605: *11 upstream sent too big header while reading response header f…

小程序API能力汇总——基础容器API(四)

ty.showStatusBar 显示手机状态栏 需引入MiniKit&#xff0c;且在>2.6.0版本才可使用 参数 Object object 属性类型默认值必填说明completefunction否接口调用结束的回调函数&#xff08;调用成功、失败都会执行&#xff09;successfunction否接口调用成功的回调函数fail…

探索体感互动游戏的多重优势

在当今数字娱乐的时代&#xff0c;体感互动游戏正逐渐成为玩家们心目中的新宠。这种游戏不仅让玩家通过控制器&#xff0c;而是通过他们自身的动作和反应来与游戏世界互动。这种新兴游戏形式不仅为玩家带来了全新的游戏体验&#xff0c;还具有诸多优势&#xff0c;从身体锻炼到…

电脑卡住不动了怎么办?三招解救你的电脑!

电脑卡住不动是一种常见的故障&#xff0c;可能会给用户带来困扰。这种情况可能由于多种原因引起&#xff0c;包括软件问题、硬件故障或系统错误。那么&#xff0c;电脑卡住不动了怎么办呢&#xff1f;在本文中&#xff0c;我们将介绍电脑卡住不动的可能原因&#xff0c;并提供…

顺序表 严蔚敏 数据结构代码c语言

P20 例2-1&#xff0c;合并线性表&#xff08;1&#xff09; 将所有Lb中但不在la中的数据元素插入到La中 void union (List &La,List Lb){//将所有Lb中但不在la中的数据元素插入到La中La_len ListLength(La);Lb_len ListLength(Lb);//求线性表的长度for(i1;i<Lb_len;i…

Postgresql 怎么实现在局域网中访问

安装PostgreSQL后&#xff0c;默认情况下只能在本机进行连接访问&#xff0c;如果需要在其他主机上访问PostgreSQL数据库服务器&#xff0c;需要进行配置。 安装连接PostgresSQL数据库可以参考博文&#xff1a;安装连接PostgresSQL数据库教程 一. 整体步骤 主要包括下面几个步…

JAVA百度地图的API

/*** 通过经纬度获取地址名称** param latitude(维度), longitude(经度)* return address(地址)*/GetMapping(value "/getAddress")public Result getAddress(RequestParam(value "LATITUDE") String latitude,RequestParam(value "LONGITUDE"…

NLP_BERT与GPT争锋

文章目录 介绍小结 介绍 在开始训练GPT之前&#xff0c;我们先比较一下BERT和 GPT 这两种基于 Transformer 的预训练模型结构&#xff0c;找出它们的异同。 Transformer架构被提出后不久&#xff0c;一大批基于这个架构的预训练模型就如雨后春笋般地出现了。其中最重要、影响…

vue+springboot登录与注册功能的实现

①首先写一个登录页面 <template> <div style"background-color: #42b983;display: flex;align-items: center;justify-content: center;height: 100vh"><div style"background-color: white;display: flex;width: 50%;height: 50%;overflow: h…

驶向未来:3D可视化模型重塑我们的道路认知

在科技的浪潮中&#xff0c;每一个革新都是对人类未来生活的深度洞察。而今&#xff0c;当可视化这一技术走进我们的视野&#xff0c;它不仅是一场视觉盛宴&#xff0c;更是一次对未来出行方式的全新探索。 一、从平面到立体&#xff0c;解锁道路新视角 你是否曾站在十字路口&…

NS安装-CentOS服务器安装Nightscout CGM

NS CGM 安装必要条件 有自己的云服务器好像没有2&#xff0c;有云服务器就行了 安装顺序 先安装数据库&#xff0c;目前支持的是 MongoDB &#xff0c;官方推荐4&#xff0c;其实目前最新版本就行。可以用宝塔安装&#xff0c;比较简单克隆代码&#xff0c;我是放到 /opt/ns…