【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串

【LeetCode刷题】Day 7

  • 题目1:209.长度最小的子数组
    • 思路分析:
    • 思路1:暴力枚举 O(N^2^)
    • 思路2:滑动窗口 O(N)
  • 题目2:3. 无重复字符的最长子串
    • 题目分析:
    • 思想1:暴力枚举+哈希表O(N^2^)
    • 思想2:滑动窗口思想+哈希表O(N)
  • 收获满满✨:

在这里插入图片描述

题目1:209.长度最小的子数组

在这里插入图片描述

思路分析:

思路1:暴力枚举 O(N2)

思路2:滑动窗口 O(N)

在这里插入图片描述

滑动窗口整体思路:
  1. 初始化左右指针;
  1. 进窗口:循环条件、维护信息
  1. 判断:判断是否达到条件,从而决定是否出窗口。
  1. 更新结果:这一点是就题论题,需要判断在哪里更新结果位置。
本题的具体体现:
  1. 初始化左右指针:int left = 0 , right = 0;
  1. 进窗口:条件:sum += nums[right]; 维护的信息:子数组的和sum;
  1. 判断:当前子数组是否满足题干要求(sum >= target),满足记录长度;
  1. 更新结果:对于这道题而言,我们需要的是最小长度,因此一次条件成立并不能满足,需要比对后,更新结果。判断条件为成立条件,则需要在条件循环内部更新。

通俗的来讲思路的话:从left开始寻找满足题意的该位置长度最小的子数组,满足题意就到下一个位置,继续找该位置长度最小的子数组。

注意:感觉和暴力有些像,但这里我们的右端点是不需要更新到和left相同的,因为有上一个数的基础,知道上一个子数组是刚好多了右边一位才满足题意的,我们left到第二位置后,是要检查少去第一位,是否还满足,不满足就更新右端点。找到当前位置的长度最小的子数组。满足,就代表这就是当前位置最小长度的子数组,就left更新。

代码实现:

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {// 滑动窗口int n = nums.size();int len = 0, sum = 0;int left=0,right=0;while(right<n) {sum += nums[right];while (sum >= target) {if(len==0) len=right+left+1;else if (right - left + 1 < len)len = right - left + 1;sum -= nums[left];left++;}right++;}return len;}
};

LeetCode链接:209.长度最小的子数组


题目2:3. 无重复字符的最长子串

在这里插入图片描述

题目分析:

就是寻找给定字符串的子串,要求子串内部没有重复出现,题干很简单。
提示中有说明:s由英文字母、数字、符号和空格组成---->简单哈希表判断重复

思想1:暴力枚举+哈希表O(N2)

找每个位置的无重复字符的最大子串,left不变,right去找,并通过hash表判断是否符合条件,不符合条件就结束这次循环,left到下一个位置,right更新到和left相同位置,继续重复上述操作。

思想2:滑动窗口思想+哈希表O(N)

在这里插入图片描述

Why?为什么使用滑动窗口思想,其实就是对暴力查找的优化,暴力查找有两个缺点:
  1. left是一个位置一个位置更新的,但在实际中比如图中例子:deabcabca ,我们在第一个位置找到的最长无重复的子串是deabc,后面是因为a重复了才结束的,我们只是left到下一个位置,其实重复位置还是一样的,仍然是a,此时的长度一定是小于上一结果的长度。我们不妨直接把left移动到第一个a后面。
  1. right每次循环都需要更新为left才开始,这也是很低效的,依旧是上面的例子:第一次循环后,left直接更新到第一个a的后面,此时开始的子串为:bc,这不就是上一次循环满足条件子串的子串吗?怎么会不符合条件呢?所以不妨right就从这个位置开始寻找。
本题的具体体现:
  1. 初始化左右指针:int left = 0 , right = 0;
  1. 进窗口:hash[s[right]]++; 维护的信息:哈希表hash;
  1. 判断:当前子串不满足条件(hash[s[right]]<=1),就进入循环,完成出哈希表 hash[s[left++]]--:更新left位置到重复字符后面,这里就是更新left位置。 更新结果len=max(len,right-left+1);;
  1. 更新结果:对于这道题,只要满足题目条件,不进循环条件,就是合适的,就可以更新len值

简单哈希表模拟: 128的空间对应ASCII码,出现过的字符,就把该字符对应ASCII码记为1,没出现过记为0,当大于1时,就是重复出现。

代码实现:

class Solution {
public:int lengthOfLongestSubstring(string s) {int hash[128]={0};  //使用数组来简单模拟哈希表int left=0,right=0,n=s.size();int len=0;while(right<n){hash[s[right]]++;       //进入窗口while(hash[s[right]]>1) //判断hash[s[left++]]--;  //出窗口len=max(len,right-left+1); //更新结果right++;}return len;}
};

LeetCode链接:3. 无重复字符的子串

收获满满✨:

  • Why?为什么使用滑动窗口?—> 就是对暴力枚举的优化,得出的要用这种思想;
  • hash表的简单模拟实现get;

好好刷题,好好学习专业知识,但也要好好生活哦🦖~ 天天开心!🎈
在这里插入图片描述


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

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

相关文章

【C语言】八进制、十六进制

前言 在我们日常生活中使用的数往往是十进制的&#xff0c;而当我们学习C语言后我们会接触到许多不同的进制并且时常需要去思考与使用这些不同的进制&#xff08;尤其是2的幂相关的进制&#xff0c;因为这种计数系统比十进制更接近于计算机的二进制系统&#xff09;&#xff0…

【图解IO与Netty系列】IO的同步与异步、阻塞与非阻塞,Linux五种IO模型

IO的同步与异步、阻塞与非阻塞&#xff0c;Linux五种IO模型 IO的同步与异步&#xff0c;阻塞与非阻塞阻塞IO与非阻塞IO同步IO与异步IO Linux五种IO模型BIONIOIO多路复用信号驱动IOAIO IO的同步与异步&#xff0c;阻塞与非阻塞 我们有时会看到类似于同步阻塞式IO、同步非阻塞式…

(避坑)SpringSecurity关于使用.antMatchers放行接口不生效问题

问题 在使用SpringSecurity的时候发现放行指定接口一直没有生效&#xff0c;使用"/**"就可以生效的问题 关于securityConfig的配置代码 Beanprotected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.csrf().disable() // 关闭csrf防护…

博客开始使用 Cache Master 缓存插件

明月在给大家推荐 Cache Master 插件的时候&#xff08;可参考【推荐个比较纯正的缓存插件——Cache Master】一文&#xff09;&#xff0c;仅仅是在其他站点上试用了一下&#xff0c;今天明月正式在博客上用上了 Cache Master&#xff0c;没有想到对 Dragon 主题的支持竟然是出…

RUST 和 GO 如何管理它们的内存

100编程书屋_孔夫子旧书网 Go 中的内存管理 Go 中的内存不会在缓存键被驱逐时立即释放。 相反&#xff0c;垃圾收集器会经常运行以发现任何没有引用的内存并释放它。 换句话说&#xff0c;内存会一直挂起&#xff0c;直到垃圾收集器可以评估它是否真正不再使用&#xff0c;而…

rtsp协议分析

rtsp概述 rtsp (real-time stream protocol)实时流媒体控制协议。RFC2326&#xff1a;这是RTSP的初始定义版本v1.0&#xff0c;由哥伦比亚大学、网景和RealNetworks公司提交给互联网工程任务组&#xff08;IETF&#xff09;作为RFC标准。RFC7826&#xff1a;这是RTSP的后续更新…

Java进阶学习笔记14——模板方法设计模式

面试和看源码。 谈到设计模式&#xff1a; 1、解决了什么问题&#xff1f; 2、怎么写&#xff1f; 模板方法设计模式解决了什么问题&#xff1f; 解决方法中存在重复代码的问题。 写法&#xff1a; 1&#xff09;定义一个抽象类&#xff1a; 2&#xff09;在里面定义两个方…

C# 控制台应用模板可生成顶级语句

C# 控制台应用模板可生成顶级语句 项目2024/01/0810 个参与者 反馈 本文内容 使用新的程序样式隐式 using 指令全局 using 指令使用旧程序样式 从 .NET 6 开始&#xff0c;新 C# 控制台应用的项目模板在 Program.cs 文件中生成以下代码&#xff1a; C#复制 // See https…

C++ prime 第五版 第14章 重载运算与类型转换

一、基本概念 重载的运算符是具有特殊名字的函数&#xff1a;它们的名字由关键字operator和其后要定义的运算符号共同组成。和其他函数一样&#xff0c;重载的运算符也包含返回类型、参数列表以及函数体。 我们不能为内置类型的运算对象重定义运算符。对于一个运算符函数来说&…

某方protobuf闲谈

问题 当我们去看某方的时候,搜索了关键词svm,然后通过抓包查看,请求的Request Payload是一串看不懂的乱码,并且返回的数据也大部分是乱码 观察请求的Content-Type是application/grpc-web+proto,没错数据的传输是protobuf的形式了 protobuf的相关概念和原理,网上有很多教…

vulhub——Aria2、bash、catic

文章目录 一、Aria2 任意文件写入漏洞二、CVE-2014-6271&#xff08;Bash Shell 漏洞&#xff09;三、CVE-2022-46169&#xff08;Cacti 前台命令注入漏洞&#xff09; 一、Aria2 任意文件写入漏洞 Aria2是一个命令行下轻量级、多协议、多来源的下载工具&#xff08;支持 HTTP…

docker-compose 搭建 单机版ELK

docker-compose 搭建 单机版ELK 前言 本次部署将使用ElasticSearch官方的镜像和Docker-Compose来创建单节点的ELK&#xff0c;用于学习ELK操作。在k8s集群内&#xff0c;如果每天的日志量超过20G以上&#xff0c;建议部署在k8s集群外部&#xff0c;以支持分布式集群的架构。在…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第26节-内嵌blender展厅

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第26节-内嵌blender展厅 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界…

网络编程的基础知识(适合新手)

网络编程 在Java中&#xff0c;网络编程是指使用Java语言进行网络通信的编程技术。这种技术使得位于不同地理位置的计算机能够通过网络进行通信&#xff0c;实现资源共享和信息传递。 一、定义 Java网络编程是Java语言在网络通信方面的应用&#xff0c;它利用Java提供的网络…

重开之数据结构(二刷)

引言: 由于前段时间学习效率不高,导致后面复习前面数据结构没有一个大纲,因此打算重新来学习以下数据结构,期望再次把数据结构学透,并有深刻的印象.并且记录每一次的学习记录 以便于后续复习 二分查找 需求:在有序数组arr内,查找target值 如果找到返回索引位置如果找不到返回…

c++(一)

c&#xff08;一&#xff09; C与C有什么区别命名空间使用 输入输出流引用指针和引用的区别定义拓展 函数重载例子测试函数重载原理 参数默认值什么是参数默认值注意 在c中如何引入c的库动态内存分配new、delete与malloc、free的区别&#xff1f; C与C有什么区别 <1>都是…

Introduction of Internet 计算机网络概述

计算机网络的概念 计算机网络的定义&#xff1a; 多台独立的计算机通过通信线路实现资源共享的计算机系统 计算机网络的组成 资源子网&#xff1a;提供共享的软件资源和硬件资源 通信子网&#xff1a;提供信息交换的网络结点和通信线路 计算机网络类型 按照拓扑排序 星型…

【STM32】计算定时器的溢出

TIM2、3、4、5、12、13、14在APB1上&#xff0c;最大计数频率84M。 TIM1、8、9、10、11在APB2上&#xff0c;最大计数频率168M。 time(arr1)/(prescale1)/Tclk 算出来的是秒 下图使用TIM14 84MHz 那么time33600*25000/8400000010S&#xff0c;10S进入一次中断 中断方式开…

基于STM32+NBIOT(BC26)设计的物联网观赏鱼缸

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目模块组成 1.2 设计思路 二、(硬件控制端)硬件选型2.1 STM32开发板2.2 PCB板2.3 USB下载线2.4 NBIOT模块2.5 杜邦线&#xff08;2排&#xff09;2.6 稳压模块2.7 电源插头2.8 水温检测传感器2.9 水质检测…

TiDB学习4:Placement Driver

目录 1. PD架构 2. 路由功能 2. TSO 2.1 TSO 概念 2.2 TSO分配过程 2.3 TSO时间窗口 3. 调度 3.1 信息收集 3.2 生成调度(operator) 3.3 执行调度 4. Label 与高可用 4.1 Label 的配置 5. 小结 1. PD架构 PD是整个TiDB的总控&#xff0c;相当于集群的大脑 PD集成了…