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

算法——滑动窗口(day7)

904.水果成篮 

904. 水果成篮 - 力扣(LeetCode)

 题目解析:

根据题意我们可以看出给了我们两个篮子说明我们在开始采摘到结束的过程中只能有两种水果的种类,又要求让我们返回收集水果的最大数目,这不难让我们联想到题目的另一层意思:求最长连续子数组,条件为不超过两种水果种类。

老规矩,我们先用暴力解法寻找优化过渡到滑动窗口。

right在遍历的过程中不仅要记录水果种类还需要记录个数,所以这里我们用哈希表作为辅助,当我们水果种类超出限制时那说明得进行第二轮的对比了。第二轮开始left往前一位,那么right是否也要复位呢?——不需要,因为第二轮right复位开始也只有两种结果,要么水果种类不变,要么水果种类变小,所以是完全没必要复位的,留在原位即可。而这个优化也引出了我们的滑动窗口算法。

算法解析:

滑动窗口流程图:

只要水果种类还没超标,那就让right继续遍历的同时用hash记录数据。当水果种类超标的时候就移动left减少水果数量,直到有一种类的水果数量为0删除该种类即可继续收录新的水果种类。最后记录长度完成解答。

代码:

class Solution {
public:int totalFruit(vector<int>& fruits) {//建立哈希表<水果种类,水果数量>unordered_map<int, int>hash;int n = fruits.size();int ret = INT_MIN;for (int left = 0, right = 0; right < n; right++){//种类不足,扩充窗口(移动right)以及哈希表收集数据hash[fruits[right]]++;//若种类仍不足则跳到下一循环开始扩充窗口//若超出种类,缩小窗口while (hash.size() > 2){//减掉对应种类上的数量hash[fruits[left]]--;//判断当水果数量为0时删除该种类if (hash[fruits[left]] == 0){hash.erase(fruits[left]);}//移动left,缩小窗口left++;}//记录长度ret = max(ret, right - left + 1);}return ret;}
};

用数组模拟哈希表版本: 

class Solution {
public:int totalFruit(vector<int>& fruits) {//数组模拟哈希表int hash[100000] ={0};//记录种类int kind = 0;int n = fruits.size();int ret = INT_MIN;for (int left = 0, right = 0; right < n; right++){if(hash[fruits[right]]==0) kind++;hash[fruits[right]]++;//若种类仍不足则跳到下一循环开始扩充窗口//若超出种类,缩小窗口while (kind > 2){//减掉对应种类上的数量hash[fruits[left]]--;//判断当水果数量为0时删除该种类if (hash[fruits[left]] == 0){kind--;}//移动left,缩小窗口left++;}//记录长度ret = max(ret, right - left + 1);}return ret;}
};

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

438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

题目解析:

本题难点之一就在于异位词,但我们总不可能列举所有的情况来一一对比,这肯定是会超时的。

所以我们转换一下思路:用哈希表记录字符串p里面各个字符出现的次数。然后再用另一个哈希表记录字符串s中一定范围内各个字符出现的次数。最终对比两哈希表推出正确结果。

所以最终问题转换为:遍历整个字符串,找出两哈希表一致的子串,记录起始位置。

我们在这里由于字符串p的限定只能3个字符串3个字符串进行判定不满足字符个数时right开始移动遍历并让哈希表辅助记录字符个数。当遍历的字符个数刚好时(这里为ccb,3个字符)对比两个哈希表,无论结果如何进入第2轮。

那么第二轮开始时right是前进好呢?还是复位?——前进(过渡到滑动窗口),因为前面已经录入哈希表中了,复位还得重新修改哈希表得不偿失。然后left前进之前删减哈希表数据并保持窗口长度,以此类推最后返回结果。~

算法解析:

本题与之前接触过的题都有些许不同,其一是这次的滑动窗口是固定长度的,其二是运用了两个哈希表进行辅助~

除此之外还需要介绍一下如何对比两个哈希表:

我们定义一个count变量来作为hash1中的有效个数(两表中能相对应的字符个数)

滑动窗口流程图:(因为步骤有点多,草草画一下)

 一些常规操作咱们就不讲了,这里主要来说一下:

当我们要录入hash1的时候需要判断录入的字符是否为有效个数(count),判断方法就是如果在hash1中该字符个数<=hash2中该字符个数,那就说明在录入后能够成为与hash2抵消该字符个数的可能,则count+1。

当我们要删减hash1的时候需要判断删减的字符在删减后是否影响有效字符个数,我们拿(c,c,b,a)举例,假如我们要删除第一个c的时候那么hash1里面的c还能和hash2里的c抵消吗?——可以的,那么就说明有效个数不会变,即hash1中该字符个数<hash2中该字符个数,count才会变化,因为在小于的时候无法抵消。

代码:

class Solution {
public:vector<int> findAnagrams(string s, string p) {//记录字符串s的数据unordered_map<int, int>hash1;//记录字符串p的数据unordered_map<int, int>hash2;vector<int> ret;//录入p数据for (auto ch : p){hash2[ch - 'a']++;}//记录字符串p中字符个数int m = p.size();//有效个数(用于抵消hash2)int count = 0;for (int left = 0, right = 0; right < s.size(); right++){//把字符串s中的字符录入hash1中hash1[s[right] - 'a']++;//判断录入字符是否为有效个数if (hash1[s[right] - 'a'] <= hash2[s[right] - 'a']){//如果发现该字符有增长到抵消hash2的可能,即为有效个数count++;}//判定结束先观察窗口长度,如果长度不够则跳到下一循环扩充窗口//如果窗口长度过长,缩小窗口if (right - left + 1 > m){//先删减hash1中的字符个数hash1[s[left] - 'a']--;if (hash1[s[left] - 'a'] < hash2[s[left] - 'a']){//如果发现在删减后出现无法抵消hash2中字符的可能,则减小该有效个数count--;}//缩小窗口left++;}//这里减完长度肯定达到标准了,可以开始对比两哈希表是否一致if (count == m){//hash1中的有效个数可以抵消掉hash2中个数,记录结果ret.push_back(left);}}return ret;}
};

相关文章:

算法——滑动窗口(day7)

904.水果成篮 904. 水果成篮 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 根据题意我们可以看出给了我们两个篮子说明我们在开始采摘到结束的过程中只能有两种水果的种类&#xff0c;又要求让我们返回收集水果的最大数目&#xff0c;这不难让我们联想到题目…...

Django学习第一天(如何创建和运行app)

前置知识&#xff1a; URL组成部分详解&#xff1a; 一个url由以下几部分组成&#xff1a; scheme&#xff1a;//host:port/path/?query-stringxxx#anchor scheme:代表的是访问的协议&#xff0c;一般为http或者ftp等 host&#xff1a;主机名&#xff0c;域名&#xff0c;…...

VScode连接虚拟机运行Python文件的方法

声明&#xff1a;本文使用Linux发行版本为rocky_9.4 目录 1. 在rocky_9.4最小安装的系统中&#xff0c;默认是没有tar工具的&#xff0c;因此&#xff0c;要先下载tar工具 2. 在安装好的vscode中下载ssh远程插件工具 3. 然后连接虚拟机 4. 查看python是否已经安装 5. 下载…...

通义千问AI模型对接飞书机器人-模型配置(2-1)

一 背景 根据业务或者使用场景搭建自定义的智能ai模型机器人&#xff0c;可以较少我们人工回答的沟通成本&#xff0c;而且可以更加便捷的了解业务需求给出大家设定的业务范围的回答&#xff0c;目前基于阿里云的通义千问模型研究。 二 模型研究 参考阿里云帮助文档&#xf…...

[k8s源码]6.reflector

Reflector 和 Informer 是 Kubernetes 客户端库中两个密切相关但职责不同的组件。Reflector 是一个较低级别的组件&#xff0c;主要负责与 Kubernetes API 服务器进行交互&#xff0c;执行资源的初始列表操作和持续的监视操作&#xff0c;将获取到的数据放入队列中。而 Informe…...

前台文本直接取数据库值doFieldSQL插入SQL

实现功能&#xff1a;根据选择的车间主任带出角色。 实现步骤&#xff1a;OA的“字段联动”功能下拉选项带不出表“hrmrolemembers”&#xff0c;所以采用此方法。 doFieldSQL("select roleid from HrmResource as a inner join hrmrolemembers as b on a.id b.resource…...

【06】LLaMA-Factory微调大模型——微调模型评估

上文【05】LLaMA-Factory微调大模型——初尝微调模型&#xff0c;对LLama-3与Qwen-2进行了指令微调&#xff0c;本文则介绍如何对微调后的模型进行评估分析。 一、部署微调后的LLama-3模型 激活虚拟环境&#xff0c;打开LLaMA-Factory的webui页面 conda activate GLM cd LLa…...

数学建模学习(1)遗传算法

一、简介 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种用于解决优化和搜索问题的进化算法。它基于自然选择和遗传学原理&#xff0c;通过模拟生物进化过程来寻找最优解。 以下是遗传算法的主要步骤和概念&#xff1a; 初始化种群&#xff08;Initialization&a…...

NumPy冷知识66个

NumPy冷知识66个 多维切片: NumPy支持多维切片&#xff0c;可以通过指定多个索引来提取多维数组的子集。 复杂数支持: NumPy可以处理复数&#xff0c;提供了复数的基本运算和函数。 比特运算: NumPy支持比特运算&#xff0c;如与、或、异或等。 数据存储格式: NumPy可以将数…...

Wi-SUN无线通信技术 — 大规模分散式物联网应用首选

引言 在数字化浪潮的推动下&#xff0c;物联网&#xff08;IoT&#xff09;正逐渐渗透到我们生活的方方面面。Wi-SUN技术以其卓越的性能和广泛的应用前景&#xff0c;成为了大规模分散式物联网应用的首选。本文将深入探讨Wi-SUN技术的市场现状、核心优势、实际应用中的案例以及…...

在 Ubuntu Server 22.04 上安装 Docker 的详细步骤

在 Ubuntu Server 22.04 上安装 Docker 的详细步骤 本文档详细记录了在 Ubuntu Server 22.04 上安装 Docker 的完整过程&#xff0c;包括解决过程中遇到的问题。希望能对读者有所帮助。 安装过程&#xff0c;重点需要看官方文档。https://docs.docker.com/engine/install/ubu…...

前端使用 Konva 实现可视化设计器(18)- 素材嵌套 - 加载阶段

本章主要实现素材的嵌套&#xff08;加载阶段&#xff09;这意味着可以拖入画布的对象&#xff0c;不只是图片素材&#xff0c;还可以是嵌套的图片和图形。 请大家动动小手&#xff0c;给我一个免费的 Star 吧~ 大家如果发现了 Bug&#xff0c;欢迎来提 Issue 哟~ github源码 g…...

vue3 -layui项目-左侧导航菜单栏

1.创建目录结构 进入cmd,先cd到项目目录&#xff08;项目vue3-project&#xff09; cd vue3-project mkdir -p src\\views\\home\\components\\menubar 2.创建组件文件 3.编辑menu-item-content.vue <template><template v-if"item.icon"><lay-ic…...

Spring AOP(1)

目录 一、AOP 概述 什么是Spring AOP&#xff1f; 二、Spring AOP 快速入门 1、引入AOP依赖 2、编写AOP程序 三、Spring AOP 详解 1、Spring AOP的核心概念 &#xff08;1&#xff09;切点&#xff08;Pointcut&#xff09; &#xff08;2&#xff09;连接点&#xff…...

第1关 -- Linux 基础知识

闯关任务 完成SSH连接与端口映射并运行hello_world.py ​​​​ ssh -p 37367 rootssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyCheckingno可选任务 1 将Linux基础命令在开发机上完成一遍 可选任务 2 使用 VSCODE 远程连接开发机并创建一个conda环境 …...

tensorflow keras Model.fit returning: ValueError: Unrecognized data type

题意&#xff1a;TensorFlow Keras 的 Model.fit 方法返回了一个 ValueError&#xff0c;提示数据类型无法识别 问题背景&#xff1a; Im trying to train a keras model with 2 inputs: an image part thats a tf.data.Dataset and a nor mal part represented by a pd.DataF…...

虚拟机固定配置IP

在Hyper-V中&#xff0c;vEthernet (Default Switch) 是Hyper-V自带的默认虚拟交换机&#xff0c;它允许虚拟机直接连接到宿主机网络或外部网络。这个虚拟交换机可以通过Hyper-V管理器或PowerShell等工具进行管理和配置。以下是具体的操作步骤&#xff1a; 一、通过Hyper-V管理…...

【Pytorch实用教程】pytorch中random_split用法的详细介绍

在 PyTorch 中,torch.utils.data.random_split 是一个非常有用的函数,用于将数据集随机分割成多个子集。这在机器学习和深度学习中非常常见,特别是当你需要将数据集分割成训练集和测试集或验证集时。这里是 random_split 的详细用法介绍: 功能 random_split 用于随机地将…...

第二讲:NJ网络配置

Ethernet/IP网络拓扑结构 一. NJ EtherNet/IP 1、网络端口位置 NJ的CPU上面有两个RJ45的网络接口,其中一个是EtherNet/IP网络端口(另一个是EtherCAT的网络端口) 2、网络作用 如图所示,EtherNet/IP网络既可以做控制器与控制器之间的通信,也可以实现与上位机系统的对接通…...

pytorch中常见的模型3种组织方式 nn.Sequential(OrderedDict)

在nn.Sequential中嵌套OrderedDict组织网络,以对层进行命名 import torch import torch.nn as nn from collections import OrderedDictclass OrderedDictCNN(nn.Module):def __init__(self):super(OrderedDictCNN, self).__init__()# 使用 OrderedDict 定义网络层self.model …...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...