《算法闯关指南:优选算法--滑动窗口》--09长度最小的子数串,10无重复字符的最长字串

《算法闯关指南:优选算法--滑动窗口》--09长度最小的子数串,10无重复字符的最长字串
🔥个人主页:@草莓熊Lotso

🎬作者简介:C++研发方向学习者

📖个人专栏:《C++知识分享》《Linux 入门到实践:零基础也能懂》《数据结构与算法》《测试开发实战指南》《算法题闯关指南》

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。

前言:聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解“局部最优”到“全局最优”的思路,解决区间调度等问题 内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力


目录

09.长度最小的子数串

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

算法思路:

解法二:(滑动窗口)

算法思路:

C++代码演示:

算法总结&&笔记展示:

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

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

算法思路:

解法二:(滑动窗口)

算法思路:

C++代码演示:

算法总结&&笔记展示:


09.长度最小的子数串

题目链接:

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

题目描述:

题目示例:

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

算法思路:

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

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

--代码这里就不演示了

解法二:(滑动窗口)

算法思路:

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

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

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

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

相信科学(这也是很多题解以及帖子没告诉你的事情:只给你说怎么做,没给你解释为什么这么做):

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

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

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

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

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

时间复杂度:虽然代码是两层循环,但是我们的 left 指针和 right 指针都是不回退的,两者最多都往后移动 n 次。因此时间复杂度是 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};//数组模拟实现hash表 int left=0,right=0,ret=0; int n=s.size(); while(right<n) { hash[s[right]]++; while(hash[s[right]]>1) { hash[s[left++]]--; } ret=max(ret,right-left+1); right++; } return ret; } };

算法总结&&笔记展示:

笔记的字有点丑,大家见谅:


往期回顾:

《算法闯关指南:优选算法-双指针》--01移动零,02复写零

《算法闯关指南:优选算法-双指针》--03快乐数,04盛水最多的容器

《算法闯关指南:优选算法-双指针》--05有效三角形的个数,06查找总价值为目标值的两个商品

《算法闯关指南:优选算法-双指针》--07三数之和,08四数之和

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

Read more

Brave Search MCP服务器安装以及客户端连接配置

Brave Search MCP服务器安装以及客户端连接配置

版权声明 * 本文原创作者:谷哥的小弟 * 作者博客地址:http://blog.ZEEKLOG.net/lfdfhl Brave Search概述 Brave Search 是一个由开发隐私浏览器 Brave 的公司推出的独立搜索引擎,其核心特点是专注于用户隐私保护,承诺不追踪用户的搜索历史或个人数据。与依赖谷歌、必应等第三方索引的传统搜索引擎不同,它主要基于自己构建的独立网络索引(约92%的查询来自自有索引)来提供结果,确保了技术自主性。该搜索引擎可通过网页端 search.brave.com 访问,并深度集成于Brave浏览器中作为默认引擎,其商业模式主要依靠与搜索词相关、而非基于用户追踪的广告。除了基本搜索,它还提供特色功能如允许用户自定义结果排序规则的 Goggles,以及能在结果顶部生成简洁答案的AI Summarizer 摘要引擎。自2021年推出以来,Brave Search 保持着增长,月查询量已达约8.43亿次。 官方网站 https://s

By Ne0inhk
【CentOS】中的Firewalld:全面介绍与实战应用(下)

【CentOS】中的Firewalld:全面介绍与实战应用(下)

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、iptables 时代 2、firewalld 时代 二、服务管理  1、Firewalld中的服务定义  2、查看已定义的服务 3、启用/禁用特定服务 启用服务 禁用服务 4、自定义服务配置 1. 创建服务配置文件 2. 编辑服务配置文件 3. 重新加载 Firewalld 配置 4. 验证自定义服务 5. 启用自定义服务 三、端口管理  1、开放特定端口 2、关闭特定端口 3、查看当前开放的端口 4、

By Ne0inhk
Flutter 三方库 flutter_lokalise 的鸿蒙化适配指南 - 同步 Lokalise 云端翻译、自动化 OTA 热更新多语言资源

Flutter 三方库 flutter_lokalise 的鸿蒙化适配指南 - 同步 Lokalise 云端翻译、自动化 OTA 热更新多语言资源

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 flutter_lokalise 的鸿蒙化适配指南 - 同步 Lokalise 云端翻译、自动化 OTA 热更新多语言资源 前言 在 Flutter for OpenHarmony 应用的敏捷开发中,硬编码多语言文本或频繁手动更新翻译文件是低效的。Lokalise 是领先的云端翻译管理平台,而 flutter_lokalise 则让应用能够直接与云端同步最新的翻译。通过该库,开发者可以实现多语言资源的“热更新”,即无需发布新版 App 即可修复翻译错误或增加新语言。本文将讲解如何在鸿蒙端集成这一强大的 OTA 翻译方案。 一、原理解析 / 概念介绍 1.1 基础原理 flutter_lokalise 通过连接 Lokalise API,

By Ne0inhk
Docker方式安装你的私人AI电脑助手Moltbot

Docker方式安装你的私人AI电脑助手Moltbot

简介 Moltbot 是什么? Moltbot(之前叫 Clawdbot ,现在最新的名字叫 OpenClaw)是一个开源的、高度可自托管的 AI 个人助手项目。它最大的特点是: * 不依赖任何专用客户端:你可以用自己已经有的聊天软件(Telegram、WhatsApp、Discord、Slack、企业微信、飞书等)来和 AI 对话。 * 真正的“电脑控制”能力:支持让 AI 直接操作你的电脑(浏览器、文件、终端命令、截图、鼠标键盘等),而不是只能聊天。 * 本地优先 + 云模型混合:可以接本地大模型(Ollama、Llama.cpp),也可以用 Claude、GPT-4o、Gemini 等云模型。 * 完全自托管:数据、记忆、

By Ne0inhk