力扣算法之滑动窗口题目--水果成篮

文章目录

  • 题目解析
  • 不同之处
  • 解决办法
    • 解决图示
  • 代码

题目解析

首先我们先看一下题目如下图所示
在这里插入图片描述
题目意思也比较容易理解其实就是你有一个篮子这个篮子只能装两个不同种类的水果,问你最多能装多少个水果,这里还贴心的弄了一个样列,121 可以看出来1和2是两个不同种类的水果所以这个篮子可以装三个水果另外就是这个题目还要求我们不能跳过某棵树摘取水果(这个特点很重要)。好的那么现在跟上节奏我们看一看这个题目跟我们平常见到的滑动窗口问题有什么不同之处。

不同之处

好的那么我们知道了这个题的题目意思之后呢我们想一下之前我们做滑动窗口的时候比较简单的窗口问题会贴心的告诉你窗口的大小对吧,但是这个题目只说了最大时两种水果没说做大可以装多少个水果,因此其实这个时滑动窗口的一种运用。

解决办法

那么我们知道了这个题目的意思以及特点后我们来看一下这个题目的解决办法,首先就是我们之前的题目都是用窗口内的元素多少与窗口大小进行比较,从而判断是否需要出窗口,而这个题目呢使用的是说如果种类数超过2才出窗口
那么首先我们要先知道我们这个篮子里的种类数有多少,那这样的话就需要我们有一个变量去保存这个窗口内的种类数,其次我们则么知道这个数字在不在窗口内呢,很简单用一个hash表去记录一下就可以了啊因为我们要注意这个数字是大于0的所以我们可以直接用一个一维数组的下标去判断即可,那么在这个窗口内的元素就让hash[num[i]]++(假设num[i]这个数字在这个窗口内)这样字就可以知道这个数字在窗口内,如果需要出窗口的话同样也只需要我们hash[num[i]]–;即可。
好的那么接下来就倒了我们的老朋友出场也就是我们在滑动窗口问题中经常用到的两个指针left和right

解决图示

1首先left和right指向同一个位置,然后right一直向右移动。
在这里插入图片描述
2当right移动到2的时候我们发现此时2如果进入到窗口中那么会导致种类数大于2那么现在需要出窗口。出窗口怎么出呢?
在这里插入图片描述
3出窗口也很简单就是让left一直向左移动一直移动到窗口内的水果种类数满足小于等于2为止。
在这里插入图片描述

代码

好的那么解释了这么长时间我们就可以实现代码并作出代码的解析了

class Solution {
public:
    int totalFruit(vector<int>& f) {
        vector<int> hash(100010, 0);
        int left = 0;
        int kinds = 0;
        int ans = 0;
        for (int right = 0; right < f.size(); right++) {
            if (hash[f[right]] == 0)kinds++;
            hash[f[right]]++;
            while (kinds > 2) {
                hash[f[left]]--;
                if (hash[f[left]] == 0)
                    kinds--;
                left++;
            }
            ans = max(ans, right - left + 1);
        }
        return ans;
    }
};

首先在这个代码中,我们的kinds就是计算窗口内的种类数的hash数组就是来保存一下当前数字在不在窗孔内。那么代码主体部分也就是for循环那里,我们可以看到,首先就是先判断,hash[f[left]]是否等于0如果等于0的话也就是说不在窗口内那么就可以kinds++代表窗口内的种类数++然后让他入窗口(为什么必须入呢因为题目要求了大家可以仔细看看)然后再使用while循环判断kind是否大与2如果大于2 那就让其减小到2(也就是出窗口)出窗口就是hash[f[left]]–并且一定要先判断当前left指向的数字是否缩小为0然后决定种类数是否需要–之后再让left++。再次期间有些同学可能会有疑问比如说某个数字是和窗口内不需要出窗口的数字是一样的也就是出现同样是2但是却不在窗口内的情况这样结果也是正确的因为题目说明了这样的情况比如下图所示
在这里插入图片描述
这种情况是可能发生的但是题目要求我们必须连续的才可以因此不影响我们做题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机组成原理 运输层

文章目录 运输层运输层协议概述进程之间的通信运输层的两个主要协议运输层的端口 用户数据报协议 UDPUDP 概述UDP 的首部格式 传输控制协议 TCP 概述TCP 最主要的特点TCP 的连接 可靠传输的工作原理停止等待协议连续 ARQ协议 TCP 报文段的首部格式TCP 可靠传输的实现以字节为单…

tcpdump常用命令

tcp首部解析&#xff1a; tcp-首部_tcp首部-CSDN博客 ref&#xff1a; Home | TCPDUMP & LIBPCAP https://www.cnblogs.com/onlyforcloud/p/4396126.html tcpdump 详细使用指南&#xff08;请尽情食用&#xff09;_tcpdump指定ip和端口-CSDN博客 【博客192】抓取报文查…

【深度学习目标检测】十五、基于深度学习的口罩检测系统-含GUI和源码(python,yolov8)

YOLOv8是一种物体检测算法&#xff0c;是YOLO系列算法的最新版本。 YOLO&#xff08;You Only Look Once&#xff09;是一种实时物体检测算法&#xff0c;其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化&#xff0c;提高了检测速度和准确性。…

八、K8S metrics-server

下载yaml文件 wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability.yaml 改名&#xff1a;mv high-availability.yaml metrics-server.yaml 查看镜像地址 查看镜像地址 grep -rn image high-availability.yaml 150: …

【人工智能平台】ubuntu22.04.3部署cube-studio

简介&#xff1a;本次安装是在虚拟机上进行&#xff0c;需要给虚拟机至少分配16GB&#xff0c;分配8GB时系统会卡死。 一、环境&#xff1a; 主机环境&#xff1a;win11&#xff08;全程科学&#xff09;vm虚拟机 虚拟机&#xff1a;ubuntu22.04.3桌面版&#xff08;新装&…

Ventoy:打造你的万能启动 U 盘 | 开源日报 No.146

ventoy/Ventoy Stars: 54.3k License: GPL-3.0 Ventoy 是一个开源工具&#xff0c;用于创建支持 ISO/WIM/IMG/VHD(x)/EFI 文件的可启动 USB 驱动器。其主要功能包括将镜像文件复制到 USB 驱动器并进行引导、一次性复制多个镜像文件并提供引导菜单选择以及在本地磁盘中浏览和引…

基于SSM的高校班级同学录网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Vue组件之间的通信方式都有哪些?

面试官&#xff1a;Vue组件之间的通信方式都有哪些&#xff1f; 一、组件间通信的概念 开始之前&#xff0c;我们把组件间通信这个词进行拆分 组件通信 都知道组件是vue最强大的功能之一&#xff0c;vue中每一个.vue我们都可以视之为一个组件通信指的是发送者通过某种媒体以…

C#灵活的任务调度组件FluentScheduler

FluentScheduler是一个C#的灵活的任务调度组件&#xff0c;支持各类任务调度。网上有很多演示代码&#xff0c;此处记录下来&#xff0c;方便自己查找。 // See https://aka.ms/new-console-template for more information //Console.WriteLine("Hello, World!");us…

Tortoise-orm 使用(一)

创建表 项目基于Vue3.0, FastAPI的模板管理系统&#xff0c;从网上找了各种资源去实践&#xff0c;现在将总结发出来&#xff0c;分享给大家&#xff0c;希望帮助大家少走些弯路。 准备工作 # tortoise-orm pip install tortoise-orm # MySQL pip install tortoise-orm[async…

数据库结构文档生成(通过PDMReader)

将数据库的表结构生成数据库结构文档有三种方法&#xff1a; 1、通过 PDMReader生成文档&#xff1b; 2、使用EZDML 工具生成&#xff08;下载地址&#xff1a;EZDML - 下载&#xff09;&#xff1b; 3、使用SCREW 插件&#xff0c;通过java代码生成。 本文章先介绍通过PDM…

ZABBIX根据IP列表,主机描述,或IP子网批量创建主机的维护任务

有时候被ZABBIX监控的主机可能需要关机重启等维护操作,为了在此期间不触发告警,需要创建主机的维护任务,以免出现误告警 ZABBIX本身有这个API可供调用(不同版本细节略有不同,本次用的ZABBIX6.*),实现批量化建立主机的维护任务 无论哪种方式(IP列表,主机描述,或IP子网)创建维护…

Cellinx NVT 摄像机 UAC.cgi 任意用户创建漏洞复现

0x01 产品简介 Cellinx NVT IP PTZ是韩国Cellinx公司的一个摄像机设备。 0x02 漏洞概述 Cellinx NVT 摄像机 UAC.cgi接口处存在任意用户创建漏洞,未经身份认证的攻击者可利用此接口创建管理员账户,登录后台可查看敏感信息,使系统处于极不安全的状态。 0x03 复现环境 FO…

Nas群晖中搭建自己的图片库

1、在套件中心下载synology phtotos 2、点击打开&#xff0c;右上角头像设置中配置 3、这样子就是已经完成了&#xff0c;可以把你的图片进行上传 4、嫌弃上传麻烦的&#xff0c;可以直接去根目录复制粘贴 5、访问 这样子就可以直接访问了

Rust-析构函数

所谓“析构函数”(destructor),是与“构造函数”(constructor)相对应的概念。 “构造函数”是对象被创建的时候调用的函数&#xff0c;“析构函数”是对象被销毁的时候调用的函数。 Rust中没有统一的“构造函数”这个语法&#xff0c;对象的构造是直接对每个成员进行初始化完…

系列十一、Spring Security登录接口兼容JSON格式登录

一、Spring Security登录接口兼容JSON格式登录 1.1、概述 前后端分离中&#xff0c;前端和后端的数据交互通常是JSON格式&#xff0c;而Spring Security的登录接口默认支持的是form-data或者x-www-form-urlencoded的&#xff0c;如下所示&#xff1a; 那么如何让Spring Securi…

面试狗面试指南系列(1/5): 做好面试需要的一切准备

面试狗&#xff0c;是一群叛逆的程序员开发的远程面试助手&#xff0c;已经帮1000朋友顺利拿到offer&#xff01; 它可以&#xff1a; 实时识别面试官语音&#xff0c;自动提取关键问题最先进的GPT4加持&#xff0c;按照方便快速阅读的方式高效组织结果&#xff0c;快速展示重…

洗地机哪个品牌的好用?目前口碑最好的洗地机

近年来&#xff0c;随着科技的不断进步和人们对生活质量要求的提高&#xff0c;洗地机已经成为家庭和商业清洁的必备工具之一。但是随之而来的问题是&#xff0c;市面上的洗地机品牌繁多&#xff0c;质量参差不齐&#xff0c;消费者很难在众多选择中找到一款质量好又耐用的产品…

计算机毕业设计 基于Java的手机销售网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

2024创业方向,必火的创业项目推荐

有人说我辛辛苦苦的上班还这么穷&#xff0c;这个世界太不公平&#xff0c;但是我要跟你说一个更扎心的事实啊&#xff0c;就是因为你兢兢业业的上班&#xff0c;所以你才这么穷。那么就有人要说了&#xff0c;不上班我能干嘛&#xff1f;这就是大多数人的一个思维&#xff0c;…
最新文章