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

news2024/11/17 7:28:55

文章目录

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

题目解析

首先我们先看一下题目如下图所示
在这里插入图片描述
题目意思也比较容易理解其实就是你有一个篮子这个篮子只能装两个不同种类的水果,问你最多能装多少个水果,这里还贴心的弄了一个样列,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.coloradmin.cn/o/1390550.html

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

相关文章

C盘满了,我用什么思路清理?

20240115 上周六同事传了一个很大的虚拟机给我&#xff0c;C盘就红了 虽然是飞秋选错了存储文件的路径&#xff0c;但后来忘了&#xff0c;就开始毫无目的删除文件&#xff0c;过程中会有没有权限删除的&#xff0c;这样还是没有改善。 咨询了公司IT技术人员&#xff0c; 告…

如何100%防止网站数据被采集?七种方法保证数据安全

当今互联网时代&#xff0c;数据采集是常见的行为&#xff0c;但也常常引起一些法律纠纷或者商业竞争。因此&#xff0c;一些网站或者公司需要采取措施来防止自己的数据被别人采集。以下是一些防止数据采集的措施&#xff1a; 防止代理IP模拟搜索引擎抓爬&#xff1a;使用代理I…

Centos7.9忘记Root密码找回

Centos7.9忘记Root密码找回 1. 背景2. 目的3. 具体操作3.1 重启系统3.2 增加代码3.3 单用户模式3.4 单用户模式3.5 修改密码3.6 创建文件3.7 重启验证 1. 背景 由于物理主机上安装了多个虚拟机&#xff0c;部分虚拟机忘记了root密码&#xff0c;前段时间刚好要用这个虚拟机&…

文件操作一(非常重要)

文件操作一&#xff08;非常重要&#xff09; 一、为什么使用文件&#xff1f;二、什么是文件&#xff1f;三、文件名(简单理解)四、二进制文件和文本文件&#xff08;重要&#xff09;五、流的概念&#xff08;非常重要&#xff09;六、文件的打开和关闭七、文件的顺序读写函数…

【Java 设计模式】创建型之工厂方法模式

文章目录 1. 定义2. 应用场景3. 代码实现4. 应用示例结语 在软件开发中&#xff0c;工厂方法模式是一种常见的创建型设计模式&#xff0c;它提供了一种将对象的实例化延迟到子类的方法。工厂方法模式通过定义一个创建对象的接口&#xff0c;但是让子类决定实例化哪个类。在本文…

【数据结构 | 直接选择排序】

直接选择排序 基本思路直接插入排序SelectSort 基本思路 直接插入排序&#xff08;StraightInsertionSort&#xff09;的基本操作是将一个记录插入到已经排好序的有序表中&#xff0c;从而得到一个新的、记录数增1的有序表。 我们可以同时从数组的头部和尾部同时进行排序工作…

集成xxljob项目如何迁移到K8S

前言 大家好&#xff0c;今天我们将基于XXL-Job&#xff0c;探讨任务调度迁移到云端的相关话题。 XXL-Job是一款功能强大、易用可靠的国产分布式任务调度平台&#xff0c;是目前国内使用比较广泛的分布式任务调度平台之一。它的主要特点包括&#xff1a; 支持分布式、多线程…

29 旋转工具箱

效果演示 实现了一个菜单按钮的动画效果&#xff0c;当鼠标悬停在菜单按钮上时&#xff0c;菜单按钮会旋转315度&#xff0c;菜单按钮旋转的同时&#xff0c;菜单按钮旋转的8个小圆圈也会依次旋转360度&#xff0c;并且每个小圆圈的旋转方向和菜单按钮的旋转方向相反&#xff0…

查看服务器的yum 源

1、cd /etc/yum.repos.d 2、编辑 CentOS-Stream-Sources.repo 3、 查看里面的yum源地址 4、更新yum源&#xff0c;执行下面指令 yum clean all # 清除系统所有的yum缓存 yum makeacache # 生成新的yum缓存 yum repolist

Spring Boot - Application Events 同步 VS 异步 发布订阅事件实战

文章目录 PreCode基础工程启动类切入口事件 发布事件同步 Listener异步Listener增加EnableAsync增加 Async 测试 Pre Spring Boot - Application Events 的发布顺序_ApplicationStartingEvent Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEv…

低代码自动化测试的实践

何为低代码测试 传统上&#xff0c;功能、 UI、端到端等测试自动化的实现都涉及编写测试脚本&#xff0c;代替测试人员执行重复的手动测试任务。自动化脚本的开发工作通常由 QA 工程师或开发人员完成&#xff0c;这需要编写大量代码。 而低代码甚至无代码的理念也是在自动化测…

SpringBoot+SSM项目实战 苍穹外卖(12) Apache POI

继续上一节的内容&#xff0c;本节是苍穹外卖后端开发的最后一节&#xff0c;本节学习Apache POI&#xff0c;完成工作台、数据导出功能。 目录 工作台Apache POI入门案例 导出运营数据Excel报表 工作台 工作台是系统运营的数据看板&#xff0c;并提供快捷操作入口&#xff0c…

SQLServer 为角色开视图SELECT权限,报错提示需要开基础表权限

问题&#xff1a; 创建了个视图V&#xff0c;里面包含V库的a表&#xff0c;和T库的b表 为角色开启视图V的SELECT权限&#xff0c;提示T库的b表无SELECT权限&#xff0c;报错如下 解决方案&#xff1a; ①在T库建个视图TV&#xff0c;里面包含b表&#xff08;注意是在b表的对…

《2023年度程序员收入报告》 :旧金山位居第一,北京程序员中位数超60万元

2024年刚刚拉开序幕&#xff0c;备受瞩目的程序员薪资调研报告再度登场。由知名数据采集平台levels.fyi 搜集并整理了《2023年全球程序员收入报告》&#xff0c;为我们揭示了程序员最新的收入情况&#xff0c;其中有哪些值得关注的亮点呢&#xff1f; 行情向好&#xff0c;大多…

MS8257N超低噪声、宽带、可选反馈电阻跨阻放大器

产品简述 MS8257N 是一颗宽带、快速过载恢复时间、快速建立时 间、跨阻增益可调、超低噪声的跨阻放大器&#xff0c;主要用于光电 监测和各种高性能的光电系统。快速过载恢复特性和内部输 入保护电路可以让信号从过载传输中快速恢复正常。两档可 选跨阻增益保证了极高的动…

Matlab深度学习进行波形分割(二)

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

Ubuntu 22.04 安装prometheus

服务器监控和报警软件有很多&#xff0c;为什么我们会选择Prometheus而不是其他软件呢&#xff1f; 因为它有以下优点&#xff1a; 自带简易web监控页面&#xff0c;用户可以很方便地查看监控数据和使用仪表盘。能实时收集数据并根据自定义警报规则推送告警&#xff1b;具有丰…

企业如何找到合适的内容策略?媒介盒子分享

企业如果想要抢先占领用户心智的话&#xff0c;媒介盒子认为首先需要找到合适的内容策略&#xff0c;好的内容能够与消费者建立双向信任的关系&#xff0c;一种让消费者对品牌的好感度提升&#xff0c;进而成为品牌的忠实用户&#xff0c;接下来媒介盒子就来和大家聊聊&#xf…

Selenium Grid - 多台计算机上并行运行

当你希望在多台计算机上并行运行测试&#xff1f;Selenium Grid可以帮你实现。 官方文档原文&#xff1a; https://www.selenium.dev/documentation/grid/getting_started/ Selenium Grid允许通过将客户端发送的命令路由到远程浏览器实例&#xff0c;在远程机器上执行WebDriv…

mac上搭建 hadoop 伪集群

1. hadoop介绍 Hadoop是Apache基金会开发的一个开源的分布式计算平台&#xff0c;主要用于处理和分析大数据。Hadoop的核心设计理念是将计算任务分布到多个节点上&#xff0c;以实现高度可扩展性和容错性。它主要由以下几个部分组成&#xff1a; HDFS (Hadoop Distributed Fi…