当前位置: 首页 > news >正文

算法每日双题精讲 —— 滑动窗口(水果成篮,找到字符串中所有字母异位词)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟

别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧!💪

今天,咱们就一同来探究 “水果成篮” 和 “找到字符串中所有字母异位词” 这两道经典题目,看看滑动窗口算法是如何在其中施展魔法的🧙‍♂️。


目录

💯水果成篮

📖题目描述

🧠讲解算法原理

💻代码实现(以 C++ 为例)

💯找到字符串中所有字母异位词

📖题目描述

 🧠讲解算法原理

 💻代码实现(以 C++ 为例)


💯水果成篮


题目链接👉【力扣】

📖题目描述

根据示例分析,该题的本质就是:找出最长子数组的长度,子数组不超过俩种水果类型

🧠讲解算法原理

解法一:

 我们用暴力解法写一下,例如f=[1,2,3,2,2]

依次找出所以的情况👇

  1.  

代码中我们利用哈希表列举情况,用哈希表统计水果出现的类型数

解法二:

先分析

 当我们用暴力解法时,遇到如下情况👇,我们让 left++ ,right 回到 left的位置,继续列举情况

当left++时,区间的 kinds 要么不变,要么减少一个

  • 当kinds不变时,right没有必要改变
  • 当kinds减少时,right可以继续向后移动

 因此我们可以用滑动窗口的解法,right不回退嘛

滑动窗口四大步:

  1.  left=0,right=0
  2. 进窗口——right右移动的时候
  3. 判断    出窗口——就是left右移动的时候
  4. 更新结果

举例: f=[1,2,1,2,3,2,3,3]

每次遍历right,让其放入hash表里面,判断有没有超出类型个数

当hash.length>2时出窗口

left右移动的时候,要根据某个水果种类的数量来进行移动,因此我们创建的hash表要有俩个参数,一个记录种类,一个记录个数

例如下面👇,我们要将left移动到3的前面

💻代码实现(以 C++ 为例)

class Solution {
public:int totalFruit(vector<int>& fruits) {int hash[100001]={0};//统计窗口内出现了多少种结果int ret=0;for(int left=0,right=0,kinds=0;right<fruits.size();right++){if(hash[fruits[right]]==0) kinds++;hash[fruits[right]]++;//进窗口while(kinds>2)//判断{//出窗口hash[fruits[left]]--;if(hash[fruits[left]]==0)   kinds--;left++;}ret=max(ret,right-left+1);}return ret;}
};

💯找到字符串中所有字母异位词


题目链接👉【力扣】

📖题目描述

 

 🧠讲解算法原理

1.如何判断俩个字符串是否是异位词?

  • 可以先排序再比较,但是时间复杂度为nlogn ,比较大
  • 通过统计字符串中字符出现的个数也可以判断,借助hash表即可

 2.解决问题

例如

暴力解法: 

计入p的长度m ,在S里依次比较 

 

优化解法:

当字符串依次遍历时, ,我们发现ba重复出现,所以我们只要将c从hash表移除,让e加入hash表即可,滑动窗口

 

滑动窗口四大步:

  1.  left=0,right=0
  2. 进窗口——right右移动的时候
  3. 判断    出窗口——就是left右移动的时候
  4. 更新结果

 

3.优化:更新结果的判断条件

利用变量count来统计窗口中“有效字符”的个数

使用一个数组targetCount来记录字符串p中每个字母的出现次数,再使用一个数组windowCount来记录当前窗口内每个字母的出现次数。设一个变量valid来表示窗口内有效字母的数量,初始值为0。 

然后,将right指针向右移动,每移动一次,就将新字母在windowCount中的计数加1,并检查该字母的计数是否等于在targetCount中的计数,如果相等,则valid1。当valid等于p中不同字母的数量时,说明当前窗口是一个字母异位词。

 

此时,将left指针向右移动,同时更新windowCountvalid,直到valid小于p中不同字母的数量。在移动left指针的过程中,如果窗口内的子串长度等于p的长度,就将left指针的索引加入到结果数组中。

 

重复上述步骤,直到right指针走到字符串s的末尾。最后,返回结果数组。

 💻代码实现(以 C++ 为例)

class Solution {
public:vector<int> findAnagrams(string s, string p) {vector<int> result;// 如果s的长度小于p的长度,直接返回空结果if (s.length() < p.length()) return result;// 用于记录字符串p中每个字母的出现次数vector<int> targetCount(26, 0);// 用于记录当前窗口内每个字母的出现次数vector<int> windowCount(26, 0);int valid = 0;// 初始化targetCount数组for (char c : p) {targetCount[c - 'a']++;}int left = 0, right = 0;while (right < s.length()) {int rightIndex = s[right] - 'a';// 将新字母在windowCount中的计数加1windowCount[rightIndex]++;// 如果该字母的计数小于等于在targetCount中的计数,说明该字母在窗口内的数量还未超过p中该字母的数量,有效字母数量加1if (windowCount[rightIndex] <= targetCount[rightIndex]) {valid++;}// 当窗口大小大于p的长度时,移动left指针缩小窗口while (right - left + 1 > p.length()) {int leftIndex = s[left] - 'a';// 将left指针指向的字母在windowCount中的计数减1windowCount[leftIndex]--;// 如果该字母的计数小于在targetCount中的计数,说明该字母在窗口内的数量已经小于p中该字母的数量,有效字母数量减1if (windowCount[leftIndex] < targetCount[leftIndex]) {valid--;}left++;}// 如果有效字母数量等于p中不同字母的数量,说明当前窗口是一个字母异位词,将left指针的索引加入结果数组if (valid == p.length()) {result.push_back(left);}right++;}return result;}
};

我以后还会对 算法 相关知识进行更多的创作,欢迎大家关注我,一起探索 算法 的奇妙世界😜

👉【A Charmer】

相关文章:

算法每日双题精讲 —— 滑动窗口(水果成篮,找到字符串中所有字母异位词)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#xff01;&#x1f4aa;…...

C++ 设计模式:享元模式(Flyweight Pattern)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 单例模式 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过共享尽可能多的相同对象来减少内存使用和提高性能。享元模式适用于大量细粒度对象的场景&#xff0c;这些对象之…...

Docker+Portainer 离线安装

1. Docker安装 步骤一&#xff1a;官网下载 docker 安装包 步骤二&#xff1a;解压安装包; tar -zxvf docker-24.0.6.tgz 步骤三&#xff1a;将解压之后的docker文件移到 /usr/bin目录下; cp docker/* /usr/bin/ 步骤四&#xff1a;将docker注册成系统服务; vim /etc/sy…...

Linux第100步_Linux之设置LCD作为终端控制台和LCD背光调节

KMS是Kemmel Mode Setting的缩写&#xff0c;内核显示模式设置。它主要负责显示的控制&#xff0c;包括屏幕分辨率、屏幕刷新率和颜色深度等等。 CRTC是指显示控制器&#xff0c;在DRM里有多个显存&#xff0c;通过操作CRTC来控制要显示那个显存。 KMS包含了FB框架。DRM驱动默…...

Chapter09 国际化i18n 和 数据校验:Validation

文章目录 1 Java国际化2 Spring6国际化3 使用Spring6国际化4 数据校验&#xff1a;Validation实验一&#xff1a;通过Validator接口实现实验二&#xff1a;Bean Validation注解实现实验三&#xff1a;基于方法实现校验实验四&#xff1a;实现自定义校验 1 Java国际化 示例&…...

活动预告 | Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁

课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动&#xff0c;了解如何更好地在 Microsoft 365 Defen…...

Unresolved plugin: ‘org.apache.maven.plugins:maven-site-plugin:3.12.1‘

问题 使用idea 社区办加载项目提示下面问题&#xff1a; Unresolved plugin: org.apache.maven.plugins:maven-site-plugin:3.12.1 问题解决 maven插件地址&#xff1a; https://maven.apache.org/plugins/maven-dependency-plugin/plugins.html Maven 中央仓库地址&#…...

5个开源RAG框架对比

还在为RAG应用开发头疼吗&#xff1f;别急&#xff0c;今天给大家推荐五款完全开源免费的RAG框架&#xff0c;覆盖自动优化、多模态处理、本地部署、生产环境支持等多种场景&#xff0c;助你轻松搞定RAG开发&#xff01;&#x1f447; 1. AutoRAG&#xff1a;自动优化&#xff…...

活动预告 | Microsoft Power Platform 在线技术公开课:实现业务流程自动化

课程介绍 参加“Microsoft Power Platform 在线技术公开课&#xff1a;实现业务流程自动化”活动&#xff0c;了解如何更高效地开展业务。参加我们举办的本次免费培训活动&#xff0c;了解如何借助 Microsoft AI Builder 和 Power Automate 优化工作流。结合使用这些工具可以帮…...

【分布式文件存储系统Minio】2024.12保姆级教程

文章目录 1.介绍1.分布式文件系统2.基本概念 2.环境搭建1.访问网址2.账号密码都是minioadmin3.创建一个桶4.**Docker安装miniomc突破7天限制**1.拉取镜像2.运行容器3.进行配置1.格式2.具体配置 4.查看桶5.给桶开放权限 3.搭建minio模块1.创建一个oss模块1.在sun-common下创建2.…...

解决ssh和git秘钥认证失败问题

已正确上传公钥到远程服务器&#xff0c;但是本地的连接认证还是使用默认秘钥文件名id_rsa或者默认用户名&#xff0c;导致了认证失败&#xff0c;总结了以下解决办法&#xff1a; 1、ssh秘钥认证 远程登录的时候可能ssh客户端默认使用id_rsa文件名秘钥&#xff0c;但是之前生…...

AI安全的挑战:如何让人工智能变得更加可信

引言 随着人工智能&#xff08;AI&#xff09;技术在各个领域的广泛应用&#xff0c;尤其是在医疗、金融、自动驾驶和智能制造等行业&#xff0c;AI正在重塑我们的工作和生活方式。从提高生产效率到实现个性化服务&#xff0c;AI带来了前所未有的便利。然而&#xff0c;在享受这…...

腾讯通RTX升级迁移攻略,兼容Linux内核国产系统及移动端

一、腾讯通RTX继续使用的主要难题 腾讯通RTX停更后&#xff0c;用户不仅无法继续获得更新、技术支持和资源下载&#xff0c;还面临着以下无法解决的使用问题&#xff1a; ● 不兼容国产系统与移动端&#xff1a;腾讯通RTX仅支持Windows和Mac操作系统&#xff0c;无法在基于Li…...

用css实现瀑布流布局

上效果 知识理解 column-count: 4; column-gap: 15px;实现固定四行瀑布流布局 columns: 200px auto;column-gap: 15px;由浏览器根据容器的宽度自动调整&#xff0c;尽可能一行多个200px宽度的列数 <!DOCTYPE html> <html lang"en"><head><me…...

FortiAl为擎重塑网络与安全运营未来

在当今数字化浪潮汹涌的时代&#xff0c;网络安全运营的重要性愈发凸显&#xff0c;而人工智能的迅猛发展则如同一股强劲的东风&#xff0c;为这一领域带来了革命性的变革。Fortinet攻防专家邹国雄在《FortiAI&#xff1a;以生成式人工智能&#xff08;GenAI&#xff09;简化Fo…...

优化租赁小程序提升服务效率与用户体验的策略与实践

内容概要 在这个快速发展的商业环境中&#xff0c;租赁小程序成为了提升服务效率和用户体验的重要工具。通过对用户需求的深入挖掘&#xff0c;我们发现他们对于功能的便捷性、响应速度和界面的友好性有着极高的期待。因此&#xff0c;针对这些需求&#xff0c;完善租赁小程序…...

基于Python的医院预约挂号与诊断系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

Spring Boot教程之四十:使用 Jasypt 加密 Spring Boot 项目中的密码

如何使用 Jasypt 加密 Spring Boot 项目中的密码 在本文中&#xff0c;我们将学习如何加密 Spring Boot 应用程序配置文件&#xff08;如 application.properties 或 application.yml&#xff09;中的数据。在这些文件中&#xff0c;我们可以加密用户名、密码等。 您经常会遇到…...

Design Compiler:两种工作模式(线负载模式和拓扑模式)

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 Design Compiler可以以线负载模式或拓扑模式启动&#xff0c;必须选择其中一个模式。在拓扑模式下还可使用多模式和UPF模式&#xff1a;多模式允许在多种工作…...

窦明—环境和教育对人的影响具象化

窦明—“环境和教育有多影响人”的具象化 本篇载体&#xff1a;窦明与环境 本篇主体&#xff1a;环境和教育对人的影响 很多网友调侃说&#xff0c;窦明前后两世性格变了&#xff0c;连面向都看起来变了 可不是嘛&#xff0c;命相和品相生面相&#xff0c;性格也影响着神态和…...

Pixel Aurora Engine应用场景:像素字体生成与游戏文本资源自动化生产

Pixel Aurora Engine应用场景&#xff1a;像素字体生成与游戏文本资源自动化生产 1. 像素艺术生成新纪元 在独立游戏开发领域&#xff0c;像素艺术始终保持着独特的魅力。传统像素画制作需要艺术家逐帧绘制&#xff0c;耗时耗力。Pixel Aurora Engine的出现&#xff0c;为游戏…...

03-Open code MCP 与工具调用

03-MCP 与工具调用 掌握 OpenCode 中 MCP&#xff08;Model Context Protocol&#xff09;服务器的配置和使用&#xff0c;扩展 AI 的工具能力。 一、MCP 概述 1.1 什么是 MCP MCP&#xff08;Model Context Protocol&#xff09;是一种标准化协议&#xff0c;允许 AI 模型与…...

OpenClaw二次开发入门:Phi-3-mini-128k-instruct模型适配改造

OpenClaw二次开发入门&#xff1a;Phi-3-mini-128k-instruct模型适配改造 1. 为什么需要自定义模型适配 去年我在尝试用OpenClaw自动化处理技术文档时&#xff0c;发现官方支持的模型在长文本生成任务上表现不稳定。当时手头正好有Phi-3-mini-128k-instruct的部署实例&#x…...

小白也能懂!Claude Code 中 Agent 和 Skill 到底有什么区别?

小白也能懂&#xff01;Claude Code 中 Agent 和 Skill 到底有什么区别&#xff1f; 你用 Claude Code 的时候&#xff0c;一定见过这两个词&#xff1a;Agent 和 Skill。 它们都能让 Claude 变得更"聪明"&#xff0c;但原理完全不同。搞混的人不在少数&#xff0c;包…...

实测!用AI从0到1完成一个项目,需要多少token?

用AI编程工具&#xff0c;从零撸图书管理系统全记录现在全网都在聊AI写项目&#xff0c;但没人说真话&#xff1a;纯靠聊天瞎怼需求&#xff0c;到底浪费多少token&#xff1f;步骤乱不乱&#xff1f;代码能不能直接跑&#xff1f;今天不玩虚的&#xff0c;全程实测飞算JavaAI智…...

解决鸿蒙方向的Flutter框架版切换问题-当前最新版本3.35.8——工具切换与命令切换

欢迎加入开源鸿蒙跨平台社区&#xff1a; https://openharmonycrossplatform.csdn.net 最新版本的仓库地址&#xff1a; https://gitcode.com/openharmony-tpc/flutter_flutter/tree/oh-3.35.7-release 本地版本非最新版本 我当前的版本是3.27.5。 需要更新到最新的。 升…...

03-Linux网络故障排查:从DNS配置到防火墙设置的全面指南

1. 当Linux告诉你"Name or service not known"时 第一次在Linux终端看到"Name or service not known"这个错误提示时&#xff0c;我正急着要下载一个重要的软件包。那种感觉就像你明明知道朋友家的地址&#xff0c;导航却死活找不到路。这个看似简单的网络…...

WindowsCleaner系统优化实战指南:从C盘告急到性能重生

WindowsCleaner系统优化实战指南&#xff1a;从C盘告急到性能重生 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 适用人群自测 请根据你的电脑使用情况选择符合…...

AI大模型风口已至!4大高薪就业方向,助你精准转型少走弯路!

当下&#xff0c;AI大模型正从“技术爆发期”迈入“全面应用期”。对于IT从业者而言&#xff0c;这并非一道“要不要转”的选择题&#xff0c;而是一道“往哪转”的战略题。 很多人想抓住这波红利&#xff0c;却卡在“不知道从哪下手”“不清楚自己适合哪个赛道”的困境中。 …...

英飞凌TLE9954 GPIO配置避坑指南:OUT.Px和GPIOx寄存器到底怎么用?

英飞凌TLE9954 GPIO配置避坑指南&#xff1a;OUT.Px和GPIOx寄存器到底怎么用&#xff1f; 在嵌入式开发中&#xff0c;GPIO&#xff08;通用输入输出&#xff09;是最基础也最常用的功能模块之一。英飞凌TLE9954作为汽车电子领域广泛应用的微控制器&#xff0c;其GPIO模块设计精…...