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;帮助企业从信息化…

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

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

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

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

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

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

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…

PHP小程序 获取二维码

//获取token public function getAccessToken($appId,$appSecret) {// 请求API获取 access_token$url "https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appid{$this->appId}&secret{$this->appSecret}";$result $this->g…

抖音关键词搜索爬虫,抖音API数据接口,抖音商品详情数据采集

抖音商品API接口抖音关键词搜索抖音直播间小黄车抖店商品数据采集 除了微博&#xff0c;小红书&#xff0c;抖音也是一个巨大的流量池。 除了评论&#xff0c;其实关键词搜索视频是更为常见的一个需求&#xff0c;于是上周末抽空开发了下&#xff0c;完成了 mvp。

MQTT协议-ISO标准下基于发布/订阅范式的消息协议

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上&#xff0c;是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议&#xff0c;为此&#xff0c;它需要一个消息中间件 。 MQTT是一个…

【单链表反转】图文解析 链表反转

目录 例题描述&#x1f4a1; 思路一 &#xff08;推荐&#xff09; 代码实现 &#x1f4a1; 思路二 代码实现 引申1. 局部反转单链表2. k个一组反转链表 例题描述 反转一个链表 示例&#xff1a; 输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1-…

海外大带宽服务器连接失败:原因与解决策略

​随着全球互联网的发展&#xff0c;越来越多的企业和个人选择使用海外大带宽服务器来满足数据传输和业务需求。然而&#xff0c;在实际使用中&#xff0c;有时会出现服务器连接失败的问题。本文将为您分析原因并提供相应的解决策略。 一、海外大带宽服务器连接失败的原因 网络…

Java三大框架简介与比较

一、引言 在Java开发领域&#xff0c;三大框架——Spring、Hibernate和MyBatis&#xff0c;各自扮演着重要的角色。它们为开发者提供了不同的解决方案&#xff0c;使得开发者能够更高效地构建企业级应用。本文将分别介绍这三大框架的特点、优势以及适用场景&#xff0c;并对它…

PCL 计算点云AABB包围盒的体积

目录 一、AABB包围盒二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。爬虫自重,把自己当个人。 一、AABB包围盒 AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即…