【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词

news2024/9/23 11:19:27

【LeetCode刷题】Day 9

  • 题目1:904. 水果成篮
    • 思路分析:
    • 思路1:暴力枚举+哈希表
    • 思路2:窗口滑动+哈希表
  • 题目2:438. 找到字符串中所有字母异位词
    • 思路分析:
    • 思路1:暴力枚举+哈希表
    • 思路2:滑动窗口+哈希表
  • 收获满满✨:

在这里插入图片描述

题目1:904. 水果成篮

在这里插入图片描述

思路分析:

对于滑动窗口来说,我们会慢慢感觉滑动窗口并不难,就拿这道题来说,难的不是算法,而是怎么记录 果篮中已经装了多少种每种种类已经选择了多少棵树以及 果篮所选种类是什么。这三个点如果用 unordered_map<int,int>来处理也是很简单,但频繁的删除,效率很低。
果篮中已经装了多少种: 主要是判断种类是否超过两种,出窗口判断时需要;
每种种类已经选择了多少棵树: 出窗口时,需要判断是否已经将该种树出完,种类数量才知道是否减少。
果篮所选种类是什么: 我们要支持果篮中种类的树进入窗口,就需要比对是否是果篮中记录的两种种类的树。

如何替换?根据题目给出的提示我们知道这个fruits[i]<=105 ,所以只用数组hash[100001]就可以记录所选种类以及已经选择种类的棵数。再用int kinds来记录种类数量就可以了

思路1:暴力枚举+哈希表

思路2:窗口滑动+哈希表

本题的滑动窗口分析:
进窗口:记录 right位置的种类数量,数据维护:果篮中的种类数量 kinds
判断:当种类数量 kinds超过两种,就需要执行出窗口操作。出窗口:去除一个种类的树,让该类树在果篮的棵数变为0,种类数量 kinds减小。
更新结果:每进一次符合要求就更新一次。

代码实现:

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int hash[100001]={0};
        int left=0,right=0,kinds=0,n=fruits.size();
        int ret=0;
        while(right<n)
        {
            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);
            right++;
        }
        return ret;
    }
};

LeetCode链接:904. 水果成篮


题目2:438. 找到字符串中所有字母异位词

在这里插入图片描述

思路分析:

我们先讨论如何判断两个字符串是异位词:无关顺序,但字母相同且各字母的数量也相同。所以我们只需要判断每个字母的数量就可以。

提示这里也说只有小写字母,总数有限,可以用哈希表;

初步思想: 两张哈希表分别统计s子串中各字母数量和p中各字母数量。如果两个表完全相同就是异位词。

思路1:暴力枚举+哈希表

列出所有长度为p.size()的子串,在比对两张哈希表,相同则push_back子串左端点下标进vector<int>容器。

思路2:滑动窗口+哈希表

对比哈希表来判断是否更新结果,这个过程需要同时遍历对比,太过于复杂,可以优化下。

用count来记录窗口中的有效字母的数量,当有效字母等于p.size()就可以更新数据。

本题的滑动窗口分析:
进窗口: hash2[in-'a']++; 维护数据: count
判断:长度是固定的为 p.size(),超过就要出窗口。出窗口也要维护数据: count
更新结果:当 count==p.size()就表明是异或词,更新结果。

代码实现:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> v;
        int hash1[26]={0};      //记录p中每个字符的个数
        for(int i=0;i<m;i++) hash1[p[i]-97]++;

        int hash2[26]={0};      //统计窗口中每一个字符出现的个数
        int count=0;            //记录有效字符的个数
        int left=0,right=0,n=s.size(),m=p.size();                
        while(right<n)
        {
            char in=s[right];
            hash2[in-'a']++;	//进窗口
            if(hash2[in-'a']<=hash1[in-'a']) count++; //维护数据
            while(right-left+1>m) //判断
            {
                char out=s[left];
                if(hash2[out-'a']<=hash1[out-'a']) count--; //维护数据
                hash2[out-'a']--;	//出窗口
                left++;
            }
            if(count==m) v.push_back(left); //更新结果
            right++;
        }
        return v;
    }
};

LeetCode链接:438. 找到字符串中所有字母异位词


收获满满✨:

  • 滑动窗口思想,什么时候用和怎么用都在操作中熟悉了,目前最主要的是对题目的理解以及一些操作处理。比如上述题中:hash哈希表的运用就需要积累。
  • 有效数据个数count 代替 两张哈希表的对比

✨✨请对自己温柔,也适当享受自己的偏爱和例外;
慢慢的,你会发现总有人也会如你一般,对你偏爱和例外!

~天天开心🎈
在这里插入图片描述

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

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

相关文章

12.可视化实现

时间过的很快,不知不觉已到第十二章。经过前面教程的讲解和实践,数据接入服务的功能已初步完成。 此章节将通过可视化的实现,对设备接入进行监控,实时监听设备的接入情况及设备的在线时长。 并且可以通过订阅按钮、取消订阅按钮、查看数据按钮,对上报数据进行实时的跟踪…

掌控安全CTF-2024年5月擂台赛-WP(部分)

MISC ez_Misc 题目给了一个加密的压缩包和一个文本文档&#xff0c;首先我们先来看文本的内容&#xff0c;如下&#xff1a; 很容易看出&#xff0c;0宽隐写&#xff0c;用PuzzleSolver梭哈一下&#xff0c;发现了&#xff1a;Thi3 is n0t 2 hint 又在文本中发现一个特征&…

【设计模式】JAVA Design Patterns——Combinator(功能模式)

&#x1f50d;目的 功能模式代表了一种以组合功能为中心的图书馆组织风格。 简单地说&#xff0c;有一些类型 T&#xff0c;一些用于构造类型 T 的“原始”值的函数&#xff0c;以及一些可以以各种方式组合类型 T 的值以构建更复杂的类型 T 值的“组合器” &#x1f50d;解释 真…

vue中封装组件实例

本篇是一篇组件封装。因为要经常使用&#xff0c;特此封装并且记录下来&#xff0c;以供参考。 封装组件&#xff1a;封装组件是指将一段具有特定功能的Vue代码&#xff08;包括模板、脚本和样式&#xff09;封装成一个可复用的组件。这个组件可以作为一个独立的单元&#xff…

国内信创数据库生态

国内信创数据库生态 国内信创数据库主要包括但不限于以下几种&#xff1a; 数据库类型与厂商&#xff1a; 达梦 &#xff08;武汉达梦&#xff09; 官网 https://www.dameng.com/DM8.html 人大金仓 &#xff08;北京&#xff09; 官网 https://www.kingbase.com.cn/tyxsjk/i…

VS2022编译CMake的工程

开源项目大都是用Make文件组织项目代码编译。对熟悉Window体系&#xff0c;一直用VS套件工作的人&#xff0c;还是有不小的隔阂。 好在有大神们帮助我们解决此类问题&#xff0c;使用CMake工具&#xff0c;可以自动转换工程类型。 1、解压缩代码&#xff0c;找到CMakeList.tx…

OrangePi AIpro初体验之图片视频检测案例真实测评

OrangePi AIpro简介 OrangePi AIpro官网 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能AI 开发板&#xff0c;其搭载了昇腾AI 处理器&#xff0c;可提供8TOPS INT8 的计算能力&#xff0c;内存提供了8GB 和16GB两种版本。可以实现图像、视频等多种数据分析与推理…

漫谈企业信息化安全 - 零信任架构

一、引言 《万物简史》的作者比尔布来森说&#xff0c;当他小的时候学科学的时候&#xff0c;好像这些科学家们都是有一种本领&#xff0c;把科学总是以一种让人看不懂的方式说得神乎其神&#xff0c;好像有藏着什么不可告人的秘密。因此&#xff0c;想要写一本让大家都能看得…

IT项目管理 第四、六、七章复习记录

网络图是项目活动之间逻辑关系或顺序的示意图&#xff0c;有两种主要格式&#xff1a; 箭头图&#xff08;AOA&#xff09;前导图/优先图&#xff08;PDM&#xff09; 箭头图 活动用箭头表示。节点或圆圈是活动的起点和终点。只能显示从完成到开始依赖。 前导图 活动由方框…

UE_地编教程_创建地形洞材质

个人学习笔记&#xff0c;不喜勿喷。侵权立删&#xff01; 使用地形洞材质来遮罩地形上特定位置的可视性和碰撞。如要在山脉侧面创建进入洞穴的入口&#xff0c;此操作将非常有用。可使用地形材质和地形洞材质的相同材质&#xff0c;但注意&#xff1a;对比不使用不透明蒙版的…

icloud照片怎么恢复到相册?2个方法,轻松解决烦恼

在现代生活中&#xff0c;照片承载着我们的回忆和珍贵的时刻&#xff0c;而iCloud提供了便捷的云存储服务&#xff0c;让用户可以方便地备份和同步手机上的照片、视频等文件。 然而&#xff0c;有时候我们可能会不小心删除了在iCloud上的照片&#xff0c;或者想要将iCloud照片…

数据挖掘案例-航空公司客户价值分析

文章目录 1. 案例背景2. 分析方法与过程2.1 分析流程步骤2.2 分析过程1. 数据探索分析2. 描述性统计分析3. 分布分析1.客户基本信息分布分析2. 客户乘机信息分布分析3. 客户积分信息分布分析 4. 相关性分析 3. 数据预处理3.1 数据清洗3.2 属性约束3. 3 数据转换 4. 模型构建4. …

AI大模型探索之路-实战篇8:多轮对话与Function Calling技术应用

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…

一次编辑00

题目链接 一次编辑 题目描述 注意点 只能进行一次(或者零次)编辑 解答思路 首先判断两个字符串的长度&#xff0c;如果长度相差大于1&#xff0c;说明一次编辑无法通过一次编辑变换而来通过两个指针idx1和idx2指向first和second&#xff0c;初始idx1和idx2指向的都是同一个…

Android 系统日志(Log) JNI实现流程源码分析

1、JNI概述 Java Native Interface (JNI) 是一种编程框架&#xff0c;使得Java代码能够与用其他编程语言&#xff08;如C和C&#xff09;编写的本地代码进行交互。JNI允许Java代码调用本地代码的函数&#xff0c;也允许本地代码调用Java代码的函数。下面是对JNI机制的详细概述…

无人机助力光伏项目测绘建模

随着全球对可再生能源需求的不断增长&#xff0c;光伏项目作为其中的重要一环&#xff0c;其建设规模和速度都在不断提高。在这一背景下&#xff0c;如何高效、准确地完成光伏项目的测绘与建模工作&#xff0c;成为了行业发展的重要课题。近年来&#xff0c;无人机技术的快速发…

帝国CMS如何修改时间格式,变成几分钟,几小时教程

该插件已经在帝国cms6.6上测试通过&#xff0c;至于其他版本&#xff0c;请自行测试。 目前支持&#xff1a;标签模板&#xff0c;列表模板&#xff0c;内容模板 安装说明&#xff1a; 把以下的内容复制到 /e/class/userfun.php 文件里&#xff08;放在<?php和?>之间…

亚马逊云科技专家分享 | OPENAIGC开发者大赛能量加油站6月5日场预约开启~

由联想拯救者、AIGC开放社区、英特尔联合主办的“AI生成未来第二届拯救者杯OPENAIGC开发者大赛”自上线以来&#xff0c;吸引了广大开发者的热情参与。 为了向技术开发者、业务人员、高校学生、以及个体创业人员等参赛者们提供更充分的帮助与支持&#xff0c;AIGC开放社区特别…

eNSP华为模拟器-DHCP配置

拓扑图 要求 PC1通过DHCP获取192.168.1.1地址PC2和PC3通过DHCP接口地址池方式获取IP地址配置静态路由使其ping通 配置 配置主机名及接口IP地址 # AR1 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sys AR1 [AR1]int g0/0/0 [AR1-Gigabit…

『ZJUBCA Weekly Feed 07』MEV | AO超并行计算机 | Eigen layer AVS生态

一文读懂MEV&#xff1a;区块链的黑暗森林法则 01 &#x1f4a1;TL;DR 这篇文章介绍了区块链中的最大可提取价值&#xff08;MEV&#xff09;概念&#xff0c;MEV 让矿工和验证者通过抢先交易、尾随交易和三明治攻击等手段获利&#xff0c;但也导致网络拥堵和交易费用增加。为了…