滑动窗口篇——如行云流水般的高效解法与智能之道(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.mzph.cn/pingmian/61856.shtml

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

相关文章

SCI论文部分题目

SC20243213 通过氢和氨集成增强Power-to-X灵活性和可持续成本降低&#xff1a;绿色实验室Skive案例研究 SC20243211 分析同时发电的综合系统中的能量和能量效率、环境影响和经济可行性&#xff0c;淡水、热水和天然气凝液 SC20243208 双燃料生物质-天然气系统中的氢、…

EG3D: Efficient Geometry-aware 3D Generative Adversarial Networks 学习笔记

1 Contributions 混合显式-隐式网络架构&#xff1a;提出了一种 Tri-plane 的3D表征方法&#xff0c;结合显式体素网格与隐式解码器的优点 速度快&#xff0c;内存效率高&#xff1b; 支持高分辨率生成&#xff0c;保持3D表征的灵活性和表达能力。与纯显式或隐式方法相比&#…

Android——连接MySQL(Java版)

Android——连接MySQL(Java版) 目录&#xff1a; Android——连接MySQL(Java版)一、JDBC1、什么是JDBC2、载入JDBC3、创建JDBC的工具类 二、使用数据库 一、JDBC 1、什么是JDBC JDBC全称Java Database Connectivity&#xff0c;译为Java语言连接数据库&#xff0c;是sun公司制…

c++中操作数据库的常用函数

在C中操作数据库&#xff0c;尤其是MySQL数据库&#xff0c;主要通过MySQL提供的C API或MySQL Connector/C库来实现。这些库提供了一系列的函数&#xff0c;使得开发者能够在C应用程序中执行数据库的连接、查询、更新、删除等操作。以下是C中操作MySQL数据库的一些常用函数&…

Java 获取本机 IP 地址的方法

文章目录 一、使用 InetAddress.getLocalHost二、遍历网络接口获取 在 Java 编程中&#xff0c;若有本机的 IP 地址的需求&#xff0c;小编来展示一下方法&#xff1a; 一、使用 InetAddress.getLocalHost 一是最基本的获取本机 IP 地址的方式。 示例代码&#xff1a; impo…

⭐ Unity 资源管理解决方案:Addressable_ Demo演示

一、使用Addressable插件的好处&#xff1a; 1.自动管理依赖关系 2.方便资源卸载 3.自带整合好的资源管理界面 4.支持远程资源加载和热更新 二、使用步骤 安装组件 1.创建资源分组 2.将资源加入资源组 3.打包资源 4.加载资源 三种方式可以加载 using System.Collections…

C++《二叉搜索树》

在初阶数据结构中我学习了树基础的概念以及了解了顺序结构的二叉树——堆和链式结构二叉树该如何实现&#xff0c;那么接下来我们将进一步的学习二叉树&#xff0c;在此会先后学习到二叉搜索树、AVL树、红黑树&#xff1b;通过这些的学习将让我们更易于理解后面set、map、哈希等…

使用go实现流式输出

流式输出的深度剖析 之前一直在调用openai的key&#xff0c;只是照着文档进行流式调用&#xff0c;也只知其确是流式与api有所不同&#xff0c;而未成体系深究其实现原理。 就以openai的官方流式输出为切入。 概述 流式输出&#xff08;Streaming Output&#xff09;是 HTT…

使用VisualStudio编写C++程序输出helloWorld

文章目录 1. C简介1.1 历史背景1.2 特点1.3 应用领域 2. 操作过程和代码2.1 打开Visual Studio(默认你下载了C的相关文件)2.2 创建新项目2.3 输入名字&#xff0c;创建2.4 右击源文件->添加->新建项2.5 命名好&#xff0c;进行添加2.6 输入代码2.7 输出结果 3. 总结 1. C…

万能的无人机锁定目标投放程序

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

LayaBox1.8.4实现UV滚动

实现思路&#xff1a; 在片元着色器采样时&#xff0c;增加一个随时间变化的偏移值&#xff0c;由于uv是一个二维向量所以加的偏移值也需要一个二维向量。注意&#xff1a;在Laya的 shader中除了0&#xff0c;输入其它数字必须输入带有小数的数字&#xff0c;否则报错 。 &quo…

Next.js- App Router 概览

#题引&#xff1a;我认为跟着官方文档学习不会走歪路 一&#xff1a;App Router与Page Router 在 v13 版本中&#xff0c;Next.js 引入了一个基于 React 服务器组件 构建的新的 App Router&#xff0c;而在这之前&#xff0c;Next.js 使用的是Page Router。 目录结构 pages …

Android studio与JS交互

文章目录 前言一、html二、使用步骤1.2.AS 总结 前言 最近在使用Android Studio的WebView,有些功能要AS与JS交互。 一、html html文件 <!DOCTYPE html> <html> <!--javascript--> <head><meta charset"utf-8"><title>Carson…

【LeetCode面试150】——228汇总区间

博客昵称&#xff1a;沈小农学编程 作者简介&#xff1a;一名在读硕士&#xff0c;定期更新相关算法面试题&#xff0c;欢迎关注小弟&#xff01; PS&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟沈小农&#xff0c;希望我的文章能帮助到你。欢迎大家在…

CPU性能优化--采集调用栈

我们可能经常会遇到程序中热点函数被多个调用者调用的情况&#xff0c;这样就需要知道哪个函数调用foo的次数最多&#xff0c;应用程序的库函数出现在热点处。要理解为什么特定函数会呈现为热点&#xff0c;我们需要知道程序的控制流图中的哪条路径是最热的。 Intel VTune prof…

简单测试下faiss 检索速度

在NLP的应用中&#xff0c;经常需要用到对向量的搜索&#xff0c;如果向量的数量级非常大&#xff0c;比如1千万&#xff0c;甚至上亿条&#xff0c;普通的方式就满足不了生产需要了&#xff0c;falcebook开源的faiss框架能够解决“海量向量搜索”的问题。faiss是为稠密向量提供…

milvus es

ES 与 Milvus 结合实现高效文档搜索的实战指南 原文链接 目录 背景介绍场景与效果概述架构对比与问题分析Milvus 向量搜索架构ES Milvus 搜索架构详细流程解析Milvus 搜索配置详解ES 搜索策略与 DSL 配置结果合并与排序策略总结与未来优化 1. 背景介绍 随着团队和公司的发…

Flutter 设计模式全面解析:抽象工厂

设计模式作为软件开发中的经典解决方案&#xff0c;在 Flutter 的开发中也能为我们提供强大的架构支持。本文来介绍一下如何在 Flutter 中来实现抽象工厂设计模式&#xff0c;以及如何创建一系列相关或依赖对象并优雅地管理它们之间的复杂依赖关系。 日常开发中我们也能经常看…

AWS IAM 及其功能

IAM 代表身份和访问管理&#xff0c;可帮助控制谁可以进入云、访问 AWS 资源以及进入后可以做什么。 身份&#xff1a; IAM 帮助管理可以与 AWS 资源交互的身份&#xff08;如用户名或服务帐户&#xff09;。 访问&#xff1a;它决定每个身份可以在 AWS 服务上执行哪些操作&am…

SpringBoot集成Minio实现上传凭证、分片上传、秒传和断点续传

总体概述 Spring Boot整合Minio后&#xff0c;前端的文件上传有两种方式&#xff1a; 1.文件上传到后端&#xff0c;由后端保存到Minio 这种方式好处是完全由后端集中管理&#xff0c;可以很好的做到、身份验证、权限控制、文件与处理等&#xff0c;并且可以做一些额外的业务逻…