我爱学算法之——滑动窗口攻克子数组和子串难题(中)

news2025/3/25 16:39:26

学习算法,继续加油!!!

一、将 x 减到 0 的最小操作数

题目解析

在这里插入图片描述

来看这一道题,题目给定一个数组nums和一个整数x;我们可以在数组nums的左边或者右边进行操作(x减去该位置的值);如果x可以减到0就返回最小操作数;如果不能,就返回-1

题目描述很简单,但是我们看到操作可以说非常头大,因为它可以在左边进行操作也可以在右边进行操作,那我们该如何去解决这个问题呢?

这里如果按题目要求去直接找左右两边的最小操作数,那这道题就非常难了。

我们不妨翻过来想,它们要求我们找左右两边操作数最小的;那我们是不是可以找数组中被我们删除左右两边后剩下的部分。

什么意思呢?

在这里插入图片描述

如上图所示,[0 , left)[right , n)是我们找到的操作数最小时的左右区间,此时这两个区间的和为x;那么我们就可以发现[left , right)区间的和就是sum - x(其中sum是数组中所以数据的和)。

那这样我们可以发现,我们找到满足题目中的要求左右两侧的区间时,此时数组中剩余的部分是一段连续的区间,并且该区间的和为sum - x

这时我们发现,只要找到一段连续的区间[left , right),并且该区间的和为sum - x,此时两侧区间的和就是x,就满足了题意;

那题目中要求我们找到最小的操作数,转换过来就是寻找的区间[left , right)最长。

算法思路

通过分析题目,我们将题目中的要求反过来想,就是我们需要找到一段连续的区间,此区间的和为sum - x,我们要找的长度最长的。

现在这道题就转换成了,找到和为sum - x的长度最长的区间(子数组)。

暴力解法:

这里简单提一下暴力解法,暴力解法节枚举所以子数组,找到其中满足条件且长度最长的。

在这里插入图片描述

这里暴力解法中right再从left位置开始遍历有些冗余,我们对其进行优化,使用s记录区间[left , right)的和,这样left++时,s减去即可;

这里因为right遍历到这个位置,区间的和s刚好满足,那left++后区间内的和一定小于sum - x,所以就不必要让right再从left位置进行遍历了。

这里使用滑动窗口进行优化:

这里为了方便描述,我们定义一个target = sum - x

  • 进窗口:当区间内的和s < target时,进窗口,更新区间内的和。
  • 出窗口:当区间内的和s > target时,进行出窗口操作,并更新区间内的和。
  • 更新结果:当出窗口操作之后,如果区间内的和s == target,这是区间满足条件,更新结果。

代码实现

这里写代码有一个坑:如果我们数组中的和小于x,此时target是小于0的,这时候我们是不能进行滑动窗口的一系列操作的。

我们需要进行特殊处理,如果target < 0,直接返回-1即可。

class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int sum = 0;
        for(auto& e:nums)
            sum+=e;
        int target = sum - x;
        if(target < 0)
            return -1;
        int ret = -1;
        for(int left = 0, right = 0, s = 0;right < nums.size();)
        {
            s+=nums[right++];
            while(s>target)
                s-=nums[left++];
            if(s == target)
                ret = max(ret, right - left);
        }
        if(ret == -1) 
            return ret;
        else
            return nums.size() - ret;
    }
};

二、水果成篮

题目解析

在这里插入图片描述

初看题目,一种当初做阅读理解的感觉,题目有点长;

来细看这一道题,给我们一个数组fruits,其中代表每一颗果树的种类;我们有两个果篮(每一个果篮只能装一种水果)我们现在要做的是进行采摘水果,根据题目描述:(我们采摘的水果只能有两种,并且采摘水果时是连续采摘的);我们要求的是我们收集水果的最大数量。

算法思路

了解了题目,现在来看如何去解决:

这里就不拐弯抹角了,直接看解题思路:

  • 入窗口:将right位置的水果采摘下来,并统计种类和数量。
  • 出窗口:当采摘的种类> 2时,我们要进行出窗口操作,将left位置对应的水果去出来;直到果篮中的种类<= 2
  • 更新结果:当果篮中的种类==2时,更新最终结果即可。

现在问题来了,如何去存储水果的种类和数量,并且我们还要方便进行存储、修改和删除操作?

这里就要用到哈希结构的unordered_map了;可以参考 unordered_set和unordered_map。

代码实现

治理代码实现就比较简单了:

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int n = fruits.size();
        int left = 0, right = 0;
        unordered_map<int,int> ump;
        int ret = 0;
        while(right < n)
        {
            //进窗口,直接使用[]
            ump[fruits[right++]]++;
            //出窗口
            while(ump.size() > 2)
            {
                ump[fruits[left]]--;
                if(ump[fruits[left]] == 0)
                    ump.erase(fruits[left]);
                left++;
            }
            ret = max(ret, right - left);
        }
        return ret;
    }
};

到这里,本篇文章算法讲解就结束了,感谢支持。

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

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

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

相关文章

从零开始上手huggingface

1. 环境配置 # git 安装&#xff1a;https://git-scm.com/ # git lfs安装&#xff1a;https://git-lfs.com git lfs install # huggingface-cli 安装&#xff1a;https://huggingface.co/docs/hub/index pip install huggingface_hub2. 网站直接下载模型 可能会中断&#xff…

用 pytorch 从零开始创建大语言模型(六):对分类进行微调

用 pytorch 从零开始创建大语言模型&#xff08;六&#xff09;&#xff1a;对分类进行微调 6 微调用于分类6.1 微调的不同类别6.2 准备数据集6.3 创建数据加载器6.4 使用预训练权重初始化模型6.5 添加分类头部6.6 计算分类损失和准确率6.7 在监督数据上微调模型6.8 使用LLM进…

Netty——BIO、NIO 与 Netty

文章目录 1. 介绍1.1 BIO1.1.1 概念1.1.2 工作原理1.1.3 优缺点 1.2 NIO1.2.1 概念1.2.2 工作原理1.2.3 优缺点 1.3 Netty1.3.1 概念1.3.2 工作原理1.3.3 优点 2. Netty 与 Java NIO 的区别2.1 抽象层次2.2 API 易用性2.3 性能优化2.4 功能扩展性2.5 线程模型2.6 适用场景 3. 总…

【Linux】信号:信号保存和处理

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.阻塞信号信号集 02.捕捉信号sigaction可重入函数volatileSIGCHLD 01.阻塞信号 实际执行信号的处理动作称为信号递达&#xff1a;每个信号都有一个默认行为&#xff0c;例如终…

应用权限组列表

文章目录 使用须知位置相机麦克风通讯录日历运动数据身体传感器图片和视频音乐和音频跨应用关联设备发现和连接剪切板文件夹文件(deprecated) 使用须知 在申请目标权限前&#xff0c;建议开发者先阅读应用权限管控概述-权限组和子权限&#xff0c;了解相关概念&#xff0c;再合…

MATLAB实现基于“蚁群算法”的AMR路径规划

目录 1 问题描述 2 算法理论 3 求解步骤 4 运行结果 5 代码部分 1 问题描述 移动机器人路径规划是机器人学的一个重要研究领域。它要求机器人依据某个或某些优化原则 (如最小能量消耗&#xff0c;最短行走路线&#xff0c;最短行走时间等)&#xff0c;在其工作空间中找到一…

【深度学习】多目标融合算法(五):定制门控网络CGC(Customized Gate Control)

目录 一、引言 二、CGC&#xff08;Customized Gate Control&#xff0c;定制门控网络&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一、引言 上一…

【NLP 42、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】

如果结局早已注定&#xff0c;那么过程就将大于结局 —— 25.3.18 自回归语言模型&#xff1a;由前文预测后文的语言模型 特点&#xff1a;单向 训练方式&#xff1a;利用前n个字预测第n1个字&#xff0c;实现一个mask矩阵&#xff0c;送入Bert模型&#xff0c;让其前文看不到…

TCP | 序列号和确认号 [逐包分析] | seq / ack 详解

注 &#xff1a; 本文为 “TCP 序号&#xff08;seq&#xff09;与确认序号&#xff08;ack&#xff09;” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;略作重排。 如有内容异常&#xff0c;请看原文。 Understanding TCP Seq & Ack Numbers […

在Linux、Windows系统上安装开源InfluxDB——InfluxDB OSS v2并设置开机自启的保姆级图文教程

一、进入InfluxDB下载官网 InfluxData 文档https://docs.influxdata.com/Install InfluxDB OSS v2 | InfluxDB OSS v2 Documentation

考研复习之队列

循环队列 队列为满的条件 队列为满的条件需要特殊处理&#xff0c;因为当队列满时&#xff0c;队尾指针的下一个位置应该是队头指针。但是&#xff0c;我们不能直接比较 rear 1 和 front 是否相等&#xff0c;因为 rear 1 可能会超出数组索引的范围。因此&#xff0c;我们需…

智慧高速,安全护航:视频监控平台助力高速公路高效运营

随着我国高速公路里程的不断增长&#xff0c;交通安全和运营效率面临着前所未有的挑战。传统的监控方式已难以满足现代化高速公路管理的需求&#xff0c;而监控视频平台的出现&#xff0c;则为高速公路的安全运营提供了强有力的技术支撑。高速公路视频监控联网解决方案 高速公路…

Jboss漏洞再现

一、CVE-2015-7501 1、开环境 2、访问地址 / invoker/JMXInvokerServlet 出现了让下载的页面&#xff0c;说明有漏洞 3、下载ysoserial工具进行漏洞利用 4、在cmd运行 看到可以成功运行&#xff0c;接下来去base64编码我们反弹shell的命令 5、执行命令 java -jar ysoserial-…

【Linux系统】Linux权限讲解!!!超详细!!!

目录 Linux文件类型 区分方法 文件类型 Linux用户 用户创建与删除 用户之间的转换 su指令 普通用户->超级用户(root) 超级用户(root) ->普通用户 普通账户->普通账户 普通用户的权限提高 sudo指令 注&#xff1a; Linux权限 定义 权限操作 1、修改文…

2.创建Collection、添加索引、加载内存、预览和搜索数据

milvus官方文档 milvus2.3.1的官方文档地址: https://milvus.io/docs/v2.3.x 使用attu创建collection collection必须要有一个主键字段、向量字段 确保字段类型与索引类型兼容 字符串类型&#xff08;VARCHAR&#xff09;通常需要使用 Trie 索引&#xff0c;而不是 AutoInd…

AIGC 新势力:探秘海螺 AI 与蓝耘 MaaS 平台的协同创新之旅

探秘海螺AI&#xff1a;多模态架构下的认知智能新引擎 在人工智能持续进阶的进程中&#xff0c;海螺AI作为一款前沿的多功能AI工具&#xff0c;正凭借其独特的多模态架构崭露头角。它由上海稀宇科技有限公司&#xff08;MiniMax&#xff09;精心打造&#xff0c;依托自研的万亿…

一文解读DeepSeek在法律商业仲裁细分行业的应用

引言 当AI闯入法律界&#xff1a;DeepSeek如何把商业仲裁变成“纠纷快车道” AI技术正在像水电煤一样渗透生活&#xff0c;随着DeepSeek的爆火出圈&#xff0c;全国各行各业都在如火如荼地接入DeepSeek&#xff0c;以期望利用DeepSeek的“超能力”来重塑各自行业的效能和格局&a…

快速入手-基于Django的主子表间操作mysql(五)

1、如果该表中存在外键&#xff0c;结合实际业务情况&#xff0c;那可以这么写&#xff1a; 2、针对特殊的字典类型&#xff0c;可以这么定义 3、获取元组中的字典值和子表中的value值方法 4、对应的前端页面写法

HTTPS协议—加密算法和中间攻击人的博弈

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

【大模型理论篇】CogVLM:多模态预训练语言模型

1. 模型背景 前两天我们在《Skywork R1V: Pioneering Multimodal Reasoning with Chain-of-Thought》中介绍了将ViT与推理模型结合构造多模态推理模型的案例&#xff0c;其中提到了VLM的应用。追溯起来就是两篇前期工作&#xff1a;Vision LLM以及CogVLM。 今天准备回顾一下Cog…