滑动窗口篇——如行云流水般的高效解法与智能之道(2)

前言:

上篇我们介绍了滑动窗口的含义并结合基础题型加以练习,本篇将以进阶难度的题目为索引,深化对于滑动窗口的运用与理解。

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

题目链接:1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)

题目分析:

1. 题目要求我们每次只能从最左侧或最右侧来进行删除,且要求在原数组上直接进行修改,以满足后续操作。

2. 如果元素之和和恰好等于x,则返回最小操作数,如果不存在满足情况,则返回-1.

3. 题中提到数组内每个元素都为正整数,但target的大小不确定。

思路讲解:

  该题的困难之处在于感到无从下手,每次操作为左侧还是右侧的不确定性,采用遍历时的恐怖时间复杂度,都让我们苦不堪言。

 这时,不妨采取正难则反的思路。

1, 我们令数组内每个元素相加,和为sum,题目的要求可转化为求一段最长的连续区间,满足和为sum-x。

2. 转化之后,则可根据连续区间的性质,利用滑动窗口求解。

滑动窗口: 

我们定义flag为数组内所有元素相加之后减去x的值,那么问题已然转化为求一段最长的连续区间,满足和与flag相等,也就是我们熟悉的滑动窗口。

1. 进窗口:由于此时每一个元素都大于0,所以在窗口内增加元素,总和必然增大,因此在sum<flag时,right保持++即可,在总和sum与flag相等时,更新区间长度。

2. 出窗口:当sum>flag时,说明区间过长,此时left++即可,避免大量冗余遍历。

注意:我们在第一节谈到滑动窗口的核心三步骤为进窗口,出窗口,更新情况。

三者并无严格的先后关系,需要根据实际情况灵活运用!!! 

代码实现:

class Solution {
public:int minOperations(vector<int>& nums, int x) {int flag=0,sum=0,len=-1;int n=nums.size();for(auto e:nums){flag+=e;}//所有元素相加if(flag<x){return -1;}//不存在符合情况flag-=x;//求取连续区间之和需满足的值for(int left=0,right=0;right<n;right++){sum+=nums[right];//进窗口while(sum>flag){sum-=nums[left++];}//出窗口if(sum==flag){len=max(len,right-left+1);}//更新情况}if(len==-1){return -1;}//没有满足的情况else{return n-len;}}
};

注意:如果不判定flag<x的情况,则会陷入死循环,因为此时flag为负数,while循环内left会一直++。 

二. 水果成篮

题目链接:904. 水果成篮 - 力扣(LeetCode)

题目分析:

题目较长,我们先理解给出了哪些条件和题目所求是什么:

1. 有一个数组,每一个元素的值代表水果种类

2. 有两个篮子,只能取两种类型的水果,每一棵树最多只能取一个水果。

3. 当遇到与两个篮子类型都不同的水果时,需要立即停止。反之则可以继续一直往后遍历采集 

4. 求可以采摘的最多水果数。

下面我们来具体分析:

 1. 水果种类匹配问题,不难想到采用哈希映射

 2. 采摘过程也是一个连续的区间,且也满足单调性,在该种情况下,如果向右采摘成功,水果总数必然增加,因此可以考虑在控制好种类匹配的基础上,使用滑动窗口进行解决。

思路讲解:

滑动窗口需满足,窗口内的水果种类数只有两种。

1. 采用哈希表记录水果的种类和数量,在种类小于2时,right侧可继续往后遍历,进窗口。

2. 当种类大于2时,left侧需要向后遍历出窗口,如果该水果对应的哈希表等于0时,代表种类减少了一种,需要及时改变记录。

 流程如下:

a. 初始化哈希表 hash 来统计窗⼝内⽔果的种类和数量;
b. 初始化变量:左右指针 left = 0,right = 0,记录结果的变量 ret = 0;
c. 当 right ⼩于数组⼤⼩的时候,⼀直执⾏下列循环:
i. 将当前⽔果放⼊哈希表中;
ii. 判断当前⽔果进来后,哈希表的⼤⼩:
• 如果超过 2:
◦ 将左侧元素滑出窗⼝,并且在哈希表中将该元素的频次减⼀;
◦ 如果这个元素的频次减⼀之后变成了 0,就把该元素从哈希表中删除;
◦ 重复上述两个过程,直到哈希表中的⼤⼩不超过 2;
iii. 更新结果 ret;
iv. right++,让下⼀个元素进⼊窗⼝;
d. 循环结束后,ret 存的就是最终结果

代码实现:

class Solution {
public:int totalFruit(vector<int>& fruits) {int hash[100001]={0};//模拟哈希int kind=0;//记录水果种类int nums=0;//记录水果个数for(int left=0,right=0;right<fruits.size();right++){if(hash[fruits[right]]==0){kind++;}//增加水果种类hash[fruits[right]]++;//进窗口while(kind>2){hash[fruits[left]]--;//出窗口if(hash[fruits[left]]==0){kind--;}//更新水果种类left++;//更新left}nums=max(nums,right-left+1);//更新水果个数}return nums;}
};

小结:

本篇关于滑动窗口进阶题型的讲解就暂告一段落,希望能对大家的学习产生帮助,欢迎各位佬前来支持斧正!!!

 

 

 

  

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序加载商品首页数据时,页码没有更新,老是page=1。

微信小程序加载商品首页数据时&#xff0c;页码没有更新&#xff0c;老是page1。 源代码 const { baseUrl } require(../../config/config); const config require(../../config/config) import { calcViewHeight, iPhone } from ~/utils/device const { getToken } requi…

优化Docker镜像:提升部署效率与降低资源消耗

目录 1. 最小化镜像层 2. 使用轻量级基础镜像 3. 多阶段构建 4. 清理不必要的文件和依赖 5. 使用.dockerignore文件 6. 压缩和优化文件系统 7. 外部化配置和数据 8. 限制容器资源 9. 定期清理未使用的镜像和容器 结论 在云计算和微服务架构的浪潮中&#xff0c;Docke…

自研芯片逾十年,亚马逊云科技Graviton系列芯片全面成熟

在云厂商自研芯片的浪潮中&#xff0c;亚马逊云科技无疑是最早践行这一趋势的先驱。自其迈出自研芯片的第一步起&#xff0c;便如同一颗石子投入平静的湖面&#xff0c;激起了层层涟漪&#xff0c;引领着云服务和云上算力向着更高性能、更低成本的方向演进。 早在2012年&#x…

ApiChain 从迭代到项目 接口调试到文档生成单元测试一体化工具

项目地址&#xff1a;ApiChain 项目主页 ApiChain 简介 ApiChain 是一款类似 PostMan 的接口网络请求与文档生成软件&#xff0c;与 PostMan 不同的是&#xff0c;它基于 项目和迭代两个视角管理我们的接口文档&#xff0c;前端和测试更关注版本迭代中发生变更的接口编写代码…

游戏引擎学习第22天

移除 DllMain() 并成功重新编译 以下是对内容的详细复述与总结&#xff1a; 问题和解决方案&#xff1a; 在编译过程中遇到了一些问题&#xff0c;特别是如何告知编译器不要退出程序&#xff0c;而是继续处理。问题的根源在于编译过程中传递给链接器的参数设置不正确。原本尝试…

“软件定义汽车”时代 | 产线海量数据刷写解决方案

一 背景 从起初汽车概念问世时期的“机械定义汽车”&#xff0c;到电力出现后的“电器定义汽车”&#xff0c;再到电子科技迅猛发展后的“电子定义汽车”&#xff0c;再到如今的“软件定义汽车”&#xff0c;可以看出&#xff0c;软件在车辆中扮演着越来越重要的角色。与此同时…

基于预测反馈的情感分析情境学习

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月25日20点02分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…

自制Windows系统(十)

上图 &#xff08;真的不是Windows破解版&#xff09; 开源地址&#xff1a;仿Windows

CTF-RE 从0到 N: 高版本 APK 调试 + APK逻辑修改再打包 + os层调试[2024 强网杯青少年专项赛 Flip_over] writeup

非常好的题,很适合新手入门!!! how tu use JEB 通过百度网盘分享的文件&#xff1a;app-debug.apk 链接&#xff1a;https://pan.baidu.com/s/11oPBq7LTnzasuefGeU6mXA?pwd1111 提取码&#xff1a;1111 --来自百度网盘超级会员V2的分享step1 反编译查看Manifest android:…

Taro React小程序开发框架 总结

目录 一、安装 二、目录结构 三、创建一个自定义页面 四、路由 1、API 2、传参 3、获取路由参数 4、设置TabBar 五、组件 六、API Taro非常好用的小程序框架&#xff0c;React开发者无缝衔接上。 一、安装 官方文档&#xff1a;Taro 文档 注意&#xff0c;项目创建…

qt添加模块

以QtNetwork模块为例 方式一 扩展-qt vs tools-qt project settings 方式二 右键选中项目-属性-qt project settings 方法三 在此界面选择select modules,即可进行相应模块添加

传统经验光照模型

1.什么是光照模型 光照模型(illumination model)&#xff0c;也称为明暗模型&#xff0c;用于计算物体某点处的光强(颜色值)&#xff0c;从算法理论基础而言&#xff0c;光照模型分为两类&#xff0c;一种是基于物理理论的&#xff0c;另一种是基于经验模型的。 基于物理理论的…

金融市场和预期

1.债券的分类 短期债券&#xff08;Short-term Bonds&#xff09;&#xff1a; 通常指到期期限在1年以内的债券。 中期债券&#xff08;Medium-term Bonds&#xff09;&#xff1a; 到期期限在1年到10年之间的债券。 长期债券&#xff08;Long-term Bonds&#xff09;&#xff…

C++:用红黑树封装map与set-2

文章目录 前言一、红黑树封装map与set中const迭代器1. 框架的搭建2. set实现const迭代器3. map实现const迭代器 二、operator[ ]1. operator[ ]要达成的样子2. insert的改变 三. 解决insert里set中的问题四. 解决map中的operator[ ]总结用红黑树封装map与set代码 前言 前面我们…

软件/游戏提示:mfc42u.dll没有被指定在windows上运行如何解决?多种有效解决方法汇总分享

遇到“mfc42u.dll 没有被指定在 Windows 上运行”的错误提示&#xff0c;通常是因为系统缺少必要的运行库文件或文件损坏。以下是多种有效的解决方法&#xff0c;可以帮助你解决这个问题&#xff1a; 原因分析 出现这个错误的原因是Windows无法找到或加载MFC42u.dll文件。这可…

07 初始 Oracle 优化器

查询优化器&#xff0c;简称优化器&#xff0c;是数据库最核心的组件之一。我们在这个系列的第一篇文章中已经给大家介绍了&#xff0c;优化器会参与到SQL语句的解析过程中&#xff0c;用来生成SQL语句的执行计划&#xff0c;直接决定SQL语句执行性能的优劣。 什么是执行计划 …

累积局部效应 (ALE) 图分析记录

Git地址&#xff1a;https://github.com/blent-ai/ALEPython/tree/dev 查看源码需要pip install alepython安装&#xff0c;这边查看源码发现就实际就一个py文件而已&#xff0c;我懒得再去安装&#xff0c;故直接下载源码&#xff0c;调用方法也可&#xff1b; # -*- coding:…

远程控制软件:探究云计算和人工智能的融合

在数字化时代&#xff0c;远程控制工具已成为我们工作与生活的重要部分。用户能够通过网络远程操作和管理另一台计算机&#xff0c;极大地提升了工作效率和便捷性。随着人工智能&#xff08;AI&#xff09;和云计算技术的飞速发展&#xff0c;远程控制工具也迎来了新的发展机遇…

正则表达式灾难:重新认识“KISS原则”的意义

RSS Feed 文章标题整理 微积分在生活中的应用与思维启发 捕鹿到瞬时速度的趣味探索 微积分是一扇通往更广阔世界的门&#xff0c;从生活中学习思维的工具。 数据库才是最强架构 你还在被“复杂架构”误导吗&#xff1f; 把业务逻辑写入数据库&#xff0c;重新定义简单与效率。…

网络原理(一):应用层自定义协议的信息组织格式 初始 HTTP

目录 1. 应用层 2. 自定义协议 2.1 根据需求 > 明确传输信息 2.2 约定好信息组织的格式 2.2.1 行文本 2.2.2 xml 2.2.3 json 2.2.4 protobuf 3. HTTP 协议 3.1 特点 4. 抓包工具 1. 应用层 在前面的博客中, 我们了解了 TCP/IP 五层协议模型: 应用层传输层网络层…