【Leetcode】滑动窗口算法-编程苍穹下划破数据暗夜的高效光弧

前言

🌟🌟本期讲解关于滑动窗口问题~~~

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

🔥 你的点赞就是小编不断更新的最大动力                                       

🎆那么废话不多说直接开整吧~~

目录

📚️1.长度最小的子数组

1.1题目描述

1.2题目解析

1.暴力枚举

2.滑动窗口

1.3代码实现

📚️2.无重复字符最长子串

2.1题目描述

2.2题目解析

1.暴力枚举

2.滑动窗口

2.3代码实现

📚️3.总结


📚️1.长度最小的子数组

1.1题目描述

本题是在一个数组内找到连续且长度最小并且数组内的和大于target数值,题目的描述如下所示:

解释:

此时的要求就是在一个数组内,找到连续的子数组(长度最小,元素的和大于目标数值),那么此时就是返回这里的最小长度即可;

1.2题目解析

1.暴力枚举

具体的思路就是:

第一步:定义两个指针(这两个指针就是表示的左右子数组的边界),然后两个指针的初始位置都是0;

第二步:将这里的right指针向每次后移动一个单位后,进行判断是否大于这里目标值

第三步:判断是否大于这里的值后,若大于则更新我们需要的两个指针之间的长度,若小于就继续向后进行移动;(每一次更新要进行取最小值

第四步:最后进行循环的跳出,边界的判定的操作,最后返回最终的长度

效果如下图所示:

解释:

这就是第一次循环,left不变,然后right不断向后移动,时刻更新这里的len长度,最后知道出界,然后进入外部循环;

解释:此时就是进入外部循环,然后right与left同一个索引的位置;

注意:更新我们需要的长度的时候要注意,这里的两个边界里的元素的和是否大于或等于我们需要的目标值,并且每次更新要取最小的一个长度,这里设计大小比较;

2.滑动窗口

这里的滑动窗口的概念其实就是双指针,并且对于上面的暴力枚举进行了优化的操作,那么具体的思路就是如下所示:

在暴力枚举的操作的情况下,我们发现当子数组内的元素之和已经大于了目标值了,那么此时right就不用向后面走了(因为后面再加肯定大于目标值,但是长度一直在增加,但是这里要最小的),然后left就可以向前走了,若此时数据变小right继续往后面走,此时就会发现,right和left两个指针一直前进;

此时两者都往前面进行移动,包含的元素,然后就像一个窗口向后面滑动一致;所以叫“滑动窗口

具体的画面如下:

解释:

为啥大于目标值right不更新位置:因为right在满足条件后, right再往后移动,确实是满足大于target的条件,但是我们这里的求最小的长度,后面就是无效遍历;

为啥小于目标值left不更新位置:因为这里的值本来就小于了这里的值,left移动不就更小了吗;

1.3代码实现

具体的代码实现如下所示:

class Solution {public int minSubArrayLen(int target, int[] nums) {// 设置两个指针int left = 0;int right = 0;int sum = 0;int len = nums.length+1;// 开始进行循环for (; right < nums.length; right++) {sum += nums[right];while (sum >= target) {len = Math.min(len,right - left + 1);// 如果此时进行的值大,出窗口sum -= nums[left];left++;}}if(len == nums.length+1){return 0;}else{return len;}}
}

解释:

具体的意思,sum就是代表这里的每一步的和,然后当这里的sum大于目标值后就进行判断更新这里的len的大小(取小的)然后此时left移动后,left和right之间的数值就是sum减去left没移动之前的数;

最后为了出现所有的值都不大于目标值,那么就直接返回0,否则返回我们拿到的len子数组的长度的值即可;

时间复杂度

这里一看就是两个循环,那么时间复杂度就是O(n^2),但是这里的两个指针都往前面移动,且不会回头,那么这里的时间复杂度就是O(N+N),最终的时间复杂度就是O(N)

📚️2.无重复字符最长子串

2.1题目描述

这里的题目要求和上面的几乎是一致的,大致就是找最长的子数组(子数组里没有重复的元素);

题目如下:

实例:

一个数组: a b c a b c b b

输出结果:3

最长子数组:[ a b c ]

解释:和上面的题目基本一致,就是返回找到的最长的子数组,然后返回这个子数组的长度即可

2.2题目解析

1.暴力枚举

还是和上面的几乎是不差的,我们可以将这字符串转化为数组的形式,然后利用模拟hash的方式进行存储字母的个数,然后规定两端的指针,len进行比较,返回最大的长度;

大致的情况如下图:

解释:

就是每个字数粗都进行遍历,发现这里存在了重复的元素,那么len不会进行更改,right走完后,left加一,然后重复上述的操作;

2.滑动窗口

结题思路:

大致就是对上述暴力枚举的提升,当这里发现出现重复的时候,right再向后面移动那么就会一直出现重复的元素,所以此时right向后枚举就是无用的,此时就要left向后移动,直到没有重复的元素,然后right再向后面移动,(要更新符合要求的子数组的长度

如下图所示:

解释:

为啥right不向后面重新枚举,假如此刻重上述中left的位置开始向后面移动,那么这里就是[ b ]       [ b c  ] ,[ b  c   a];哎此时就是不用向后移动的原因,len还是会重1更新成3;所以right不用向后重新遍历枚举;

2.3代码实现

具体的代码如下所示:

class Solution {public int lengthOfLongestSubstring(String s) {char[] arr=s.toCharArray();//hash数组int[] hash=new int[128];int left=0,right=0,len=0;while(right < arr.length){//放到hash表里hash[arr[right]]++;while(hash[arr[right]] > 1){//将数据移出hash表hash[arr[left]]--;left++;}len=Math.max(len,right-left+1);right++;}return len;}
}

解释:

这里就是通过hash表的方式判断元素的数量,(hash是通过索引代表的每个元素,128可以代表所有的元素),然后就是right先移动,判断出现是否重复后,在将left位置元素去掉,然后left向后移动;每次移动要判断是否没有了重复的元素;

当然要注意更新len的长度,但是注意了:“right++,和长度的更新,要注意位置,否则长度会多1”

时间复杂度:和上面时间复杂度是一致的都是O(N);

📚️3.总结

上述的两道题主要概括:

right移动看做是进窗口,left移动是出窗口:其实就是进窗口后判断什么时候出窗口,然后按要求更新出窗口之前的长度,继续进窗口,就是一个循环而已~~·

本期主要讲解了双指针优化,滑动窗口的实现;解决了“长度最小的子数组”“无重复字符最长子串”两题;

第一题:LCR 008. 长度最小的子数组 - 力扣(LeetCode)

第二题:3. 无重复字符的最长子串 - 力扣(LeetCode)

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!! 


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                 😊😊  期待你的关注~~~

 

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

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

相关文章

【2025最新版】搭建个人博客教程

【2025最新版】搭建个人博客教程 –小记&#xff1a; 在搭建我的这个博客之前我在CSDN也发布过一些文章&#xff0c;目前应该也是几千粉丝了&#xff0c;但是看到别人都是用自己博客写的就感觉自己很LOW&#xff0c;所以就想自己来搭建一个属于自己的个人博客。当然搭建博客的…

多旋翼无人机 :桨叶设计—跷跷板结构

多旋翼无人机 &#xff1a;桨叶设计——跷跷板结构 前言跷跷板结构 前言 2024年11月&#xff0c;大疆发布了最新的农业无人机T70和T100。其中T70不同于以往的机型&#xff0c;在桨夹处采用了翘翘板结构&#xff0c;大疆将其命名为“挥舞桨叶”。 T70 无人机如下 放大其中螺旋…

力扣打卡14:多数元素

链接&#xff1a;169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 这道题正常很简单&#xff0c;但是如果想要完成进阶做法有点困难。我使用了O(n/2)左右的空间&#xff0c;使用了哈希映映射。 看了题解&#xff0c;有一种解法叫摩尔投票&#xff0c;可以解决这种问题…

MySQL八股文

MySQL 自己学习过程中的MySQL八股笔记。 主要来源于 小林coding 牛客MySQL面试八股文背诵版 以及b站和其他的网上资料。 MySQL是一种开放源代码的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;使用最常用的数据库管理语言–结构化查询语言&#xff08;SQL&…

JS原型及原型链

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

List【Redis对象篇】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a; 文章目录 LIst1.简介2.使用场景3.常用操作1.写操作2.读操作 4.底层实现5.压缩列表的优化1.ZIPLIST结构2.ziplist更新数据3.LISTPACK优化 6.总结&#xff08;重点&#xff09; LIst 1.简介 Redis List是一组…

专业125+总分400+南京理工大学818考研经验南理工电子信息与通信工程,真题,大纲,参考书。

考研成功上岸&#xff0c;苦尽甘来&#xff0c;专业818信号系统与数字电路125&#xff0c;总分400&#xff0c;被南理工录取&#xff0c;从最早信心满满&#xff0c;到中期犹豫不决&#xff0c;到后期破釜沉舟&#xff0c;一路颠颠簸簸&#xff0c;总算坚持过来了&#xff0c;群…

ruoyi Cannot find module ‘@/views/system/user/index‘

Cannot find module /views/system/user/index 删除node_module 后打包成功

mall-admin-web开源项目搭建教程(图文)

本章教程,介绍如何在本地部署运行mall-admin-web这个开源项目。 开源地址:https://gitee.com/macrozheng/mall-admin-web mall-admin-web是一个电商后台管理系统的前端项目,基于Vue+Element实现。主要包括商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计…

【计算机视觉】边缘检测

图像的边缘简单来说就是图像中灰度不连续的地方。 1.图像梯度 图像梯度是指图像像素灰度值在某个方向上的变化&#xff1b;图像梯度是图像的一阶导数&#xff0c;实际计算时可以使用差分来近似。 1.1 什么是图像梯度&#xff1f; 图像梯度是一种数学工具&#xff0c;用于描…

Microsemi Libero SoC免费许可证申请指南(Microchip官网2024最新方法)

点击如下链接&#xff1a; https://www.microchip.com/en-us/products/fpgas-and-plds/fpga-and-soc-design-tools/fpga/licensing 点击右侧&#xff0c;请求免费的License 如果提示登录&#xff0c;请先登录Microchip账号。 点击Request Free License。 选项一年免费的Li…

[C++]类的继承

一、什么是继承 1.定义&#xff1a; 在 C 中&#xff0c;继承是一种机制&#xff0c;允许一个类&#xff08;派生类&#xff09;继承另一个类&#xff08;基类&#xff09;的成员&#xff08;数据和函数&#xff09;。继承使得派生类能够直接访问基类的公有和保护成员&#xf…

harbor镜像仓库搭建

Harbor简介 Harbor的发展背景和现状 Harbor项目起始于2014年左右,当时正值容器技术和微服务架构迅速崛起的时期。随着越来越多的企业开始采用容器化部署应用,对于私有镜像管理的需求也日益增长。传统的解决方案要么缺乏必要的企业级特性(如访问控制、安全性和可扩展性),…

01-51单片机硬件基础

开发板介绍 学校授课用的是普中科技的EM3.V2.2开发板&#xff0c;没什么好说的&#xff0c;记着去淘宝上找原理图&#xff0c;别迷信课本。 网上有卖51最小系统板的&#xff0c;比开发板便宜&#xff0c;也有下载模块&#xff0c;可以自己搭建外围电路。 还可以自己在protue…

方法引用和lambda表达式的奥妙

方法引用替代Lambda表达式 什么情况可以使用方法引用替代lambda表达式&#xff1f; 下面代码中两处使用了lambda表达式&#xff0c;一个是filter内&#xff0c;一个是forEach内。其中&#xff0c;forEach内的lambda表达式可以被方法引用替代&#xff0c;但是filter内的lambda…

Android通过okhttp下载文件(本文案例 下载mp4到本地,并更新到相册)

使用步骤分为两步 第一步导入 okhttp3 依赖 第二步调用本文提供的 utils 第一步这里不做说明了&#xff0c;直接提供第二步复制即用 DownloadUtil 中 download 为下载文件 参数说明 这里主要看你把 destFileName 下载文件名称定义为什么后缀&#xff0c;比如我定义为 .mp4 下…

What is load balancing? 什么是负载均衡?

原文链接 What Is Load Balancing? | IBM 什么是负载均衡&#xff1f; 在多台服务器之间高效的分配网络流量的过程&#xff0c;以优化应用程序的可用性&#xff0c;同时确保积极的用户体验。 电商网站依赖负载均衡&#xff08;load balancing&#xff09;来确保web应用能够无…

黑马商城微服务复习(6)

MQ高级 1. 消息可靠性2. 发送者的可靠性1. 发送者问题2. 生产者重试机制3. 生产者确认机制4. MQ可靠性5. 消费者的可靠性 3. 延迟消息1. 定义2. 死信交换机 1. 消息可靠性 发送消息时丢失&#xff1a; 生产者发送消息时连接MQ失败生产者发送消息到达MQ后未找到Exchange生产者发…

内网是如何访问到互联网的(华为源NAT)

私网地址如何能够访问到公网的&#xff1f; 在上一篇中&#xff0c;我们用任意一个内网的终端都能访问到百度的服务器&#xff0c;但是这是我们在互联网设备上面做了回程路由才实现的&#xff0c;在实际中&#xff0c;之前也说过运营商是不会写任何路由过来的&#xff0c;那对于…

oracle归档模式下的快速热备方法-适合小库

在我们的一些小型的oracle生产库中&#xff0c;有些时候我们可以在不停库且不使用rman的情况下实现数据库的热备。该热备的原理是通过控制数据文件块头的scn号在备份时候不变化&#xff0c;进而保证备份的数据文件数据一致性。 一、环境 数据库版本&#xff1a; 数据库需要开启…