leetcode【滑动窗口】相关题目分析讲解:leetcode209,leetcode904

经典滑动窗口(leetcode209)

题干

题目难度:简单
在这里插入图片描述

题目分析

要求找到符合大于等于target的长度最小的子数组的常规思路便是暴力破解——遍历数组,通过两层遍历,找到最小的子数组并返回。

但显而易见,这样时间复杂度会是O(n2)级别的,我们追求更好的时间复杂度,因此要考虑其他的方法。

由此,我们引入双指针法,感兴趣的小伙伴可以看我之前的运用到两个指针的leetcode学习讲解文章:

算法之二分查找优化

既然我们以左指针为遍历的时候,会出现同一个元素被多次遍历,从而造成O(n2)的时间复杂度。

那么我们以右指针为遍历的时候会怎样呢?

首先,右指针只会从头到尾遍历一遍,时间复杂度是O(n)级别的,左指针只会后移不会前移,动态地配合右指针寻找符合条件的最小子数组,因此左指针的时间复杂度也是O(n)。

从而,使整个算法达到O(n)级别的时间复杂度。

代码分析

根据上面的分析,我们需要将右指针作为遍历的指针。

每次右指针所指向的元素,加入到sum里,直到sum达到目标值target后,左指针才开始移动,将sum的值去除左指针指向的值,不断缩小左右指针之间的距离。

sum的值小于target后退出循环,right继续右移动一位。

根据这个思路我们编写代码如下:

class Solution {public int minSubArrayLen(int target, int[] nums) {int sum=0;int left=0;int right=0;int min=nums.length+1;for(;right<nums.length;right++){sum=sum+nums[right];while(sum>=target){min=Math.min(min,right-left+1);sum=sum-nums[left];left++;}}return min==nums.length+1? 0:min;}
}

虽然这个代码套了两层的括号,但它的时间复杂度是O(n)而不是O(n2)

这是因为虽然它有两层括号,但时间上只是左右指针分别循环了一次,时间复杂度是两个O(n),每个元素分别被左右指针滑过,并不是嵌套的。

滑动窗口相关题目:leetcode904:水果成篮

题干

题目难度:中等

在这里插入图片描述
在这里插入图片描述

题目分析

上面的经典滑动窗口题目,我们已经成功完成。

上一道题的思想,是根据不同的条件判断缩小滑动窗口,我们要确保滑动窗口内的元素是连续的,右指针用来遍历,而左指针在条件触发时缩小。

同样地,这个思路可以运用到本题,针对这个题目,我们要判断出什么情况下要缩小窗口。

已知我们有两个篮子,也就意味着我们能够存储两种类型的值,比如如下的数组:

fruits = [1,2,3,2,2]

当right指针滑动到3的时候,我们发现,3已经是新的水果了,这个时候篮子无法再存储它,因此我们需要缩小窗口,将原本的左篮子存储的1值都扔掉,left指针右移,移动到2处。

这个时候,篮子存储的两种不同的值,是23

比如下面的数组:

fruits = [3,3,3,1,1,1,2,3,3,4]

333111都是相同的,因此right指针在这些下标移动的时候,left指针无需移动,只需要将值加入到存储里面即可。

right移动到2的时候,这是一个新的值,因此left指针移动,窗口要缩小,一直缩小到第一个1所在的位置。

到此为止,题目的大致思路我们便搞清楚了。

但这时候又出现了新的问题,我们应当在什么时候更新总水果数?

首先我们要搞清楚,总水果数记录的是什么,它记录的是两种不同水果的数量和,并且要求我们最终返回一个最大的值。

那么针对同一种水果,a b,他们的最大和加入为max,这时候right滑动到水果c的时候,水果变成了bc,这个时候,存储的两种水果发生了变化。

因此我们要在这个时刻更新max值,也就是存储的水果发生变化的时候

由此,我们要在right指针循环的循环体的末尾,存储一次max值,也就是说right每移动一次,我们就更新一次max值

  • 若right指向的是原本的ab水果,那么max值相当于是增大了1位
  • 若right指向的是新水果c,则max值相当于新的b和c水果的总和

代码编写

根据上面的分析,我们开始代码的编写。

由于用到了滑动窗口,因此我们需要两个指针leftright,分别指向窗口的左右边界。

我们需要存储两种不同的水果,以及他们的数量。

最简单的方法是创建变量,比如a,b来记录fruits[i]的值,即水果种类
sum1,sum2分别记录他们的数量。

但我们有更加方便和合适的方法——那就是Java里的map集合,HashMap

HashMap<key ,value>可以通过键值对来存储,键是唯一的,刚好可以用来存储水果,而值value则用来存储水果的数量。

当right指针移动时,我们将当前的fruits[right]作为key存储HashMap

如果是同样的keyvalue+1。不同的key,则存储一个新的键值对。

HashMapsize大于2,即有第三个水果出现的时候,left移动,我们让left指针右移,同时将它存储的值都清空。

根据以上思路,我们编写代码如下:

import java.util.HashMap;class Solution {public int totalFruit(int[] fruits) {// 使用哈希表记录每种水果的数量HashMap<Integer, Integer> fruitCount = new HashMap<>();int left = 0, max = 0;for (int right = 0; right < fruits.length; right++) {// 将当前水果加入窗口fruitCount.put(fruits[right], fruitCount.getOrDefault(fruits[right], 0) + 1);// 如果窗口内水果种类超过两种,收缩左边界while (fruitCount.size() > 2) {fruitCount.put(fruits[left], fruitCount.get(fruits[left]) - 1);if (fruitCount.get(fruits[left]) == 0) {fruitCount.remove(fruits[left]);}left++;}// 更新最大值max = Math.max(max, right - left + 1);}return max;}
}

注意fruitCount.put(fruits[right], fruitCount.getOrDefault(fruits[right], 0) + 1);这样写是简便的写法,它相当于下面的代码:

if (fruitCount.containsKey(fruits[right])) {fruitCount.put(fruits[right], fruitCount.get(fruits[right]) + 1);
} else {fruitCount.put(fruits[right], 1);
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ArkTS组件结构和状态管理

1. 认识基本的组件结构 ArkTS通过装饰器Component 和Entry 装饰 struct 关键字声明的数据结构&#xff0c;构成一个自定义组件 自定义组件中提供了一个build函数&#xff0c;开发者需要在函数内以链式调用的方式进行基本的UI描述&#xff0c;UI描述的方法请参考UI描述规范srtuc…

语义分割(semantic segmentation)

语义分割(semantic segmentation) 文章目录 语义分割(semantic segmentation)图像分割和实例分割代码实现 语义分割指将图片中的每个像素分类到对应的类别&#xff0c;语义区域的标注和预测是 像素级的&#xff0c;语义分割标注的像素级的边界框显然更加精细。应用&#xff1a…

【STM32】在 STM32 USB 设备库添加新的设备类

说实话&#xff0c;我非常想吐槽 STM32 的 USB device library&#xff0c;总感觉很混乱。 USB Device library architecture 根据架构图&#xff1a; Adding a custom class 如果你想添加新的设备类&#xff0c;必须修改的文件有 usbd_desc.cusbd_conf.cusb_device.c 需要…

【母线槽分类与选型】

母线槽是一种高效、安全、节能的输电设备&#xff0c;广泛应用于各类建筑和工业领域。母线槽可以根据不同的分类方式进行划分&#xff0c;例如根据其结构、用途、导体材质等。母线槽以铜或铝作为导体、用非烯性绝缘支撑&#xff0c;然后装到金属槽中而形成的新型导体。在高层建…

一些任务调度的概念杂谈

任务调度 1.什么是调度任务 依赖&#xff1a;依赖管理是整个DAG调度的核心。调度依赖包括依赖策略和依赖区间。 依赖分为任务依赖和作业依赖&#xff0c;任务依赖是DAG任务本身的依赖关系&#xff0c;作业依赖是根据任务依赖每天的作业产生的。两者在数据存储模型上有所不同…

Unifying Top-down and Bottom-up Scanpath Prediction Using Transformers

Abstract 大多数视觉注意力模型旨在预测自上而下或自下而上的控制&#xff0c;这些控制通过不同的视觉搜索和自由观看任务进行研究。本文提出了人类注意力变换器&#xff08;Human Attention Transformer&#xff0c;HAT&#xff09;&#xff0c;这是一个能够预测两种形式注意力…

解决MindSpore-2.4-GPU版本的安装问题

问题背景 虽说在MindSpore-2.3之后的版本中不在正式的发行版中支持GPU硬件后端&#xff0c;但其实在开发分支版本中对GPU后端是有支持的&#xff1a; 但是在安装的过程中可能会遇到一些问题或者报错&#xff0c;这里复现一下我的Ubuntu-20.04环境下的安装过程。 Pip安装 基本的…

【拥抱AI】如何使用BERT等预训练模型计算语义相似度

使用BERT等预训练模型计算语义相似度是一种非常有效的方法&#xff0c;可以捕捉句子之间的深层次语义关系。下面是一个详细的步骤指南&#xff0c;介绍如何使用BERT和Sentence-BERT来计算语义相似度。 1. 环境准备 1.1 安装必要的库 首先&#xff0c;确保你已经安装了必要的…

Excel常用技巧分享

excel单元格内换行 直接按回车会退出当前单元格的编辑&#xff0c;如果需要在单元格中换行&#xff0c;需要按下AltEnter。 excel插入多行或多列 WPS 在WPS中想要插入多行&#xff0c;只需在右键菜单中输入对应的数字即可。 Office Excel excel中相对麻烦一些&#xff0c;比…

C# .NET环境下调用ONNX格式YOLOV8模型问题总结

我的环境是&#xff1a; Visual Studio: 2019 显卡&#xff1a; 一、遇到问题 1、EntryPointNotFoundException:无法在DLL“onnxruntime”中找到名为“OrtGetApiBase”的入口点。差了下原因&#xff0c;入口点是启动项中的问题。 原因&#xff1a;之前用yolov7时安装的版本在C…

【PTA】【数据库】【SQL命令】编程题1

数据库SQL命令测试题1 10-1 显示教工编号以02开头的教师信息 作者 冰冰 单位 广东东软学院 显示教工编号以02开头的教师信息 提示&#xff1a;请使用SELECT语句作答。 表结构: CREATE TABLE teacher ( TId CHAR(5) NOT NULL, -- 教师工号&#xff0c;主键 DId CHAR(2) …

VSCode快速生成vue组件模版

1&#xff0c;点击设置&#xff0c;找到代码片段 2&#xff0c;搜索vue&#xff0c;打开vue.json 3&#xff0c;添加模版 vue2模板 "vue2": {"prefix": "vue2","body": ["<template>"," <div>$0</di…

理解DOM:前端开发的基础

理解DOM 在前端开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;是一个至关重要的概念。它不仅定义了如何通过编程方式访问和修改网页内容&#xff0c;还为我们提供了一种结构化的方式来与页面交互。本文将带你了解DOM的基本概念、不同节点的操作以及何时可以进行更…

如何将几个音频合成一个音频?非常简单的几种合成方法

如何将几个音频合成一个音频&#xff1f;音频合成不仅仅是将不同的音频文件按顺序排列&#xff0c;它还可能涉及到音量调节、剪辑、淡入淡出、音效调整等多个方面。对于一些专业的音频制作人员来说&#xff0c;音频的每一部分细节都可能需要精心打磨&#xff0c;以确保最终合成…

虚拟化表格(Virtualized Table)性能优化

文章目录 功能介绍一开始的代码领导让我们分析一下开始优化如何监听事件和传参&#xff1f;定位操作栏更加优化 功能介绍 菜鸟最近做的一个功能如下&#xff1a; 后端返回两个很大的数组&#xff0c;例如&#xff1a;数组a 1w条&#xff0c;数组b 2w条&#xff0c;然后要操作b…

Orcad 输出有链接属性的PDF

安装adobe pdf安装Ghostscript修改C:\Cadence\SPB_16.6\tools\capture\tclscripts\capUtils\capPdfUtil.tcl ​ 设置默认打印机为 Adobe PDF ​ 将Ghostscript的路径修改正确 打开cadence Orcad &#xff0c;accessories->candece Tcl/Tk Utilities-> Utilities->PD…

从源头保障电力安全:输电线路动态增容与温度监测技术详解

在电力系统中&#xff0c;输电线路是电能传输的关键环节。然而&#xff0c;当导线温度过高时&#xff0c;会加速导线老化&#xff0c;降低绝缘性能&#xff0c;甚至引发短路、火灾等严重事故&#xff0c;对电网安全运行构成巨大威胁。近日&#xff0c;某地区因持续高温和用电负…

递归系列 简单(倒序输出一个正整数)

倒序输出一个正整数 时间限制: 1s 类别: 递归->简单 问题描述 例如给出正整数 n12345&#xff0c;希望以各位数的逆序形式输出&#xff0c;即输出54321。 递归思想&#xff1a;首先输出这个数的个位数&#xff0c;然后将个位丢掉&#xff0c;得到新的数&#xff0c;继续…

矩阵论在图像算法中的应用

摘要&#xff1a; 本文详细阐述了矩阵论在图像算法中的广泛应用。首先介绍了图像在计算机中的矩阵表示形式&#xff0c;然后从图像压缩、图像变换、图像特征提取与识别、图像恢复与重建等多个方面深入分析了矩阵论相关技术的作用原理和优势。通过对这些应用的探讨&#xff0c;展…

鸿蒙改变状态栏和安全区域颜色之 expandSafeArea

改变状态栏和安全区域颜色之 expandSafeArea 基于API12。 参考文档 直接设置build里边根元素的背景色之后&#xff0c;本想着是整个页面的颜色全变成相应的颜色&#xff0c;不过实际上状态栏跟地步安全区域是不受影响的。这个时候一般可能都会各种地方找API来设置状态栏跟安全…