【优选算法必刷100题】第009~010题(滑动窗口):长度最小的子数串、无重复字符的最长字串

【优选算法必刷100题】第009~010题(滑动窗口):长度最小的子数串、无重复字符的最长字串

🔥个人主页:Cx330🌸

❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》《优选算法指南-必刷经典100题》

🌟心向往之行必能至


🎥Cx330🌸的简介:


目录

09.长度最小的子数串

解法一:(暴力求解)(会超时)

算法思路:

解法二:(滑动窗口)

算法思路:

C++代码演示:

算法总结&&笔记展示:

10.无重复字符的最长字串

解法一:(暴力求解)(不会超时,可以通过):

算法思路:

解法二:(滑动窗口)

算法思路:

C++代码演示:

算法总结&&笔记展示:


09.长度最小的子数串

题目链接:

209. 长度最小的子数组 - 力扣(LeetCode)

题目描述:

题目示例:

解法一:(暴力求解)(会超时)

算法思路:

【从前往后】枚举数组中的任意一个元素,把它当成起始位置。然后从这个【起始位置】开始,然后寻找一段最短的区间,使得这段区间的和【大于等于】目标值。

将所有元素作为起始位置所得的结果中,找到【最小值】即可。

--代码这里就不演示了

解法二:(滑动窗口)

算法思路:

由于此问题分析的对象是【一段连续的区间】,因此可以考虑【滑动窗口】的思想来解决这道题

让滑动窗口满足:从 位置开始,窗口内所有的和小于 target (那么当窗口内元素之和第一次大于等于目标值的时候,就是 位置开始,满足条件的最小长度)

做法:将右端元素划入窗口之中,统计出此时窗口内元素的和:

  • 如果窗口内元素之和大于 target :更新结果,并且将左端元素划出去的同时继续判断是否满足条件并更新结果(因为左端元素可能很小,划出去之后依旧满足条件)
  • 如果窗口内元素之和不满足条件:right++,另下一个元素进入窗口

为何滑动窗口可以解决问题,并且时间复杂度更低?

这个窗口寻找的是:以当前窗口最左侧元素(记为 left)为基准,符合条件的情况。也就是在这道题中,从 left 开始,满足区间和 sum>=target 时的最右侧(记为 right)能到哪里

我们既然已经找到从 left 开始的最优的区间,那么就可以大胆舍去 left。但是如果继续像方法一一样,重新开始统计第二个元素(left2)往后的和,势必会有大量重复的计算(因为我们在求第一段区间的时候,已经算出很多元素的和了,这些和是可以在计算下次区间和的时候用上的)

此时,right1的作用就体现出来了,我们只需要将 left1 这个值从 sum  中剔除。从 right1 这个元素开始,往后找满足 left2 元素的区间 (此时 right1 也有可能是满足的,因为 left1 可能很小。sum 剔除掉 left1 之后,依旧满足大于等于 target )。这样我们就能省掉大量重复的计算

  • 这样我们不仅能解决问题,效率也会大大提升。

时间复杂度:虽然代码是两层循环,但是我们的 left 指针和 right 指针都是不回退的,两者最多都往后移动 次。因此时间复杂度是 O(N)

C++代码演示:

class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int n=nums.size(),sum=0,len=INT_MAX; for(int left=0,right=0;right<n;right++) { sum+=nums[right];//进窗口 while(sum>=target)//判断 { len=min(len,right-left+1);//更新 sum-=nums[left++]; } } return len==INT_MAX?0:len; } };
算法总结&&笔记展示:

博主笔记(字迹有点丑,请大家见谅):


10.无重复字符的最长字串

题目链接:

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

题目描述:

题目示例:

解法一:(暴力求解)(不会超时,可以通过):

算法思路:

枚举【从每一个位置】开始往后,无重复字符的子串可以到达什么位置。找到其中长度最大的即可。

在往后寻找无重复子串能到达的位置时,可以利用【哈希表】统计出字符出现的频次,来判断什么时候子串出现了重复元素

解法二:(滑动窗口)

算法思路:

研究的对象依旧是一段连续的区间,因此继续使用【滑动窗口】思想来优化。

让滑动窗口满足:窗口内所有元素都是不重复的

做法:右端元素 ch 进入窗口的时候,哈希表统计这个字符的频次:

  • 如果这个字符出现的频次超过 1 ,说明窗口内有重复元素,那么就从左侧开始划出窗口,直到 ch 这个元素的频次变为 1,然后再更新结果
  • 如果没有超过 1,说明当前窗口没有重复元素,可以直接更新结果

C++代码演示:

class Solution { public: int lengthOfLongestSubstring(string s) { int hash[128]={0}; int n=s.size(),left=0,right=0,ret=0; while(right<n) { hash[s[right]]++; while(hash[s[right]]>1) { hash[s[left++]]--; } ret=max(ret,right-left+1); right++; } return ret; } };
算法总结&&笔记展示:

博主笔记(字迹有点丑,请大家见谅):


往期回顾:

【优选算法必刷100题】第001~002题(双指针算法):移动零、复写零问题

【优选算法必刷100题】第003~004题(双指针算法):快乐数和盛水最多的容器

【优选算法必刷100题】第005~006题(双指针算法):有效三角形的个数和查找总价值为目标值的两个商品

【优选算法必刷100题】第007~008题(双指针算法):三数之和,四数之和

总结:本篇博客介绍了两个滑动窗口算法实战题解:209.长度最小的子数组和3.无重复字符的最长子串。针对第一题,通过暴力解法和滑动窗口对比,详细解释了滑动窗口的高效原理,即通过左右指针不回退降低时间复杂度。第二题同样采用滑动窗口,利用哈希表统计字符频次来检测重复。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持

Read more

Python中的鸭子类型:理解动态类型的力量

Python中的鸭子类型:理解动态类型的力量

Python中的鸭子类型:理解动态类型的力量 * 什么是鸭子类型? * 鸭子类型的特点 * 1. 灵活性 * 2. 动态性 * 3. 简洁性 * 鸭子类型的实现 * 鸭子类型的优缺点 * 优点 * 缺点 * 鸭子类型的实际应用 * 1. 插件系统 * 2. 框架开发 * 3. 数据处理 * 总结 Python以其动态类型系统而闻名,而鸭子类型(Duck Typing)是这一系统的核心特性之一。鸭子类型是一种编程范式,它强调“行为”而非“类型”。换句话说,如果一个对象“像鸭子一样行走、游泳和嘎嘎叫”,那么它就可以被视为鸭子,而无需显式地检查其类型。 在这篇博客中,我们将深入探讨鸭子类型的定义、特点、优缺点以及实际应用,帮助你更好地理解和利用这一强大的特性。 什么是鸭子类型? 鸭子类型是一种动态类型机制,其核心思想是:对象的行为决定了它的类型,而不是其声明的类型。在Python中,鸭子类型允许我们在运行时动态地检查对象是否具有所需的方法或属性,

By Ne0inhk

【Python】.ipynb 文件详细介绍

.ipynb 文件详细介绍 .ipynb 是目前使用最广泛的 Jupyter Notebook 文件格式,全称 IPython Notebook(后来改名叫 Jupyter Notebook,但文件扩展名一直保留了 ipynb)。 它是 Jupyter 项目最核心的文件格式,几乎成了数据科学、机器学习、科研论文复现、教学演示、算法实验的“标准容器”。 1. .ipynb 文件本质上是什么? 它是一个 JSON 格式的纯文本文件,里面按照固定结构保存了: * 代码单元格(Code cells) * Markdown 单元格(说明文字、公式、表格、图片链接等) * 原始输出结果(代码运行后的 stdout、stderr、图片、HTML、表格、Plotly 图、DataFrame

By Ne0inhk
Python数据统计完全指南:从入门到实战

Python数据统计完全指南:从入门到实战

文章目录 * 1. 数据统计基础与环境配置 * 1.1 Python数据科学生态系统 * 1.2 环境配置与安装 * 2. 数据获取与加载 * 2.1 从不同数据源加载数据 * 2.2 数据基本信息查看 * 3. 数据清洗与预处理 * 3.1 缺失值处理 * 3.2 数据转换与编码 * 4. 描述性统计分析 * 4.1 基本统计量计算 * 4.2 高级统计分析 1. 数据统计基础与环境配置 1.1 Python数据科学生态系统 Python在数据统计领域的强大主要得益于其丰富的库生态系统: # 核心数据分析库import pandas as pd import numpy as np # 数据可视化库import matplotlib.pyplot

By Ne0inhk
【Python】【数据分析】Python 数据分析与可视化:全面指南

【Python】【数据分析】Python 数据分析与可视化:全面指南

目录 * 1. 环境准备 * 2. 数据处理与清洗 * 2.1 导入数据 * 2.2 数据清洗 * 示例:处理缺失值 * 示例:处理异常值 * 2.3 数据转换 * 3. 数据分析 * 3.1 描述性统计 * 3.2 分组分析 * 示例:按年龄分组计算工资的平均值 * 3.3 时间序列分析 * 4. 数据可视化 * 4.1 基本绘图 * 示例:柱状图 * 4.2 使用 Seaborn 绘制图表 * 示例:箱型图 * 4.3 高级可视化技巧 * 示例:热力图

By Ne0inhk