当前位置: 首页 > 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 …...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...