leetcode 904. 水果成篮(优质解法)

代码:

class Solution {public int totalFruit(int[] fruits) {int length=fruits.length;int []fruitNums=new int[length+1];  //用于记录各个种类摘了多少个水果int count=0;    //用于记录当前采摘了几种水果int sum=0;  //用于记录当前共摘了多少水果for(int left=0,right=0;right<fruits.length;right++){//将 right 指针指向的数据进窗口int in=fruits[right];   //要采摘的水果//判断当前采摘的水果是否是之前没有的种类if(fruitNums[in]==0){count++;//判断水果种类是否超过了2while (count>2){//将 left 指针指向的数据出窗口int out=fruits[left++];fruitNums[out]--;if(fruitNums[out]==0){count--;}}}fruitNums[in]++;sum=Math.max(sum,right-left+1);}return sum;}
}

题解:

        首先我们需要理清题目需求:

        (1).只有 两个 篮子,并且每个篮子只能装 单一类型 的水果,说明只能选两个类型的水果

        (2).可以选择任意一棵树开始采摘,必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 ,每采摘一次,你将会向右移动到下一棵树,并继续采摘,一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。说明必须连续采摘,直到水果类型超过两种为止

        通过连续二字,我们很容易想到,该题目需要我们找到一个符合要求的子数组,首先子数组中的数字种类不能超过 2 ,其次我们要找到符合条件的最长子数组,取得他的长度

        我们很容易想到的暴力解法就是,遍历出所有的子数组,找到数字种类不能超过 2并且长度最长的那一个

        对于查找子数组的相关问题,通常我们会想到采用滑动窗口的方法来解决,用示例3来说明fruits = [1,2,3,2,2]

        首先需要遍历找出符合条件的子数组,让 L 和 R 指针指向下标为 0 的位置,L 和 R 指针之间便是我们当前要讨论的子数组,我们用一个哈希表 fruitNums 来记录篮子里已经装的水果种类和数量,用 count 来记录当前篮子里已经有的水果种类,当 R 指针指向 1 时,我们就需要在哈希表中添加 key =1,value=1 的信息,代表篮子中有 1 个种类为 1 的水果,由于之前哈希表中没有种类 1水果的相关信息,代表篮子中的水果种类增加 1 ,此时 count = 1,记录当前的水果数量 1

1        2        3        2        2

L

R

        让 R 指针向右移动,再添加一个水果到篮子中,在哈希表中添加 key =2,value=1 的信息,由于之前哈希表中没有种类 2 水果的相关信息,代表篮子中的水果种类增加 1 ,此时 count = 2,记录当前的水果数量 2

1        2        3        2        2

L

          R        

        让 R 指针向右移动,再添加一个水果到篮子中,在哈希表中添加 key =3,value=1 的信息,由于之前哈希表中没有种类 3 水果的相关信息,代表篮子中的水果种类增加 1 ,此时 count = 3 > 2,两个篮子装不下了,代表以 L 指针为首的子数组讨论完毕,现在让 L 指针向右移动

1        2        3        2        2

L

                    R  

        L 指针向右移动后,哈希表中的 key =1 对应的 value 值减 1,value = 0,代表篮子中少了一种水果,count减 1 ,为 2,记录当前的水果数量 2 ,这里就存在一个问题,当 L 指针向右移动,是否需要 R 指针回到 L 指针所在的位置,从头遍历子数组?答案是不需要, 因为此时 L 指针和 R 指针之间(不包括 R 指针)的水果种类肯定是小于等于 2 的,只有加上 R 指针指向的水果,水果种类才可以多于 2 ,即使 R 指针回到 L 指针所在的位置,后面还是会移动到当前位置 

1        2        3        2        2

          L       

                    R  

        后面就一直循环上述操作即可

        

        

        

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

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

相关文章

【操作系统和计网从入门到深入】(二)进程

前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记&#xff0c;所以如果是博主比较熟悉的知识点&#xff0c;博主可能就直接跳过了&#xff0c;但是所有重要的知识点&#xff0c;在这个专栏里面都会提到&#xff01;而且我也一定会保证这个专栏知识点的完整性&…

【docker 】 安装docker(centOS7)

官网 docker官网 github源码 官网 在CentOS上安装Docker引擎 官网 在Debian上安装Docker引擎 官网 在 Fedora上安装Docker引擎 官网 在ubuntu上安装Docker引擎 官网 在RHEL (s390x)上安装Docker引擎 官网 在SLES上安装Docker引擎 最完善的资料都在官网。 卸载旧版本 …

【微信支付】商品支付流程实例

微信支付流程实例 0.准备 三种支付方式的流程梳理可见&#xff1a;微信支付三种常见支付方式流程梳理 微信支付准备过程中的重要参数&#xff1a; 选择【接入模式】参数申请&#xff1a; 【AppId】【商户号 mchid】完成以上两项参数的申请后&#xff0c;还需要绑定 AppId 与…

【操作系统到计网从入门到深入】(一)Linux基础知识预备

前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记&#xff0c;所以如果是博主比较熟悉的知识点&#xff0c;博主可能就直接跳过了&#xff0c;但是所有重要的知识点&#xff0c;在这个专栏里面都会提到&#xff01;而且我也一定会保证这个专栏知识点的完整性&…

开源框架Apache NiFi调研

开源框架Apache NiFi调研 NiFi背景介绍一、什么是NiFi1.1 Apache NiFi特点&#xff1a;流管理、易用性、安全性、可扩展的体系结构和灵活的伸缩模型。1.2 Apache NiFi特性1.2 Apache NiFi核心概念1.3架构 二、NiFi的诞生&#xff0c;要致力于解决的问题有哪些&#xff1f;三、为…

家具制造ERP软件包含哪些功能?家具制造业ERP系统哪个好

不同的家具有不同的用料、品质、制造工时、营销渠道等&#xff0c;而有些家具制造企业采用传统的管理方式在处理物料BOM、生产实际成本核算、库存盘点、供应商选择、班组计件核对、生产领用以及物料追溯等方面存在不少提升空间。 与此同时也有很多的皮具制造企业借助ERP软件优…

class077 区间dp-下【算法】

class077 区间dp-下【算法】 算法讲解077【必备】区间dp-下 code1 括号区间匹配 // 完成配对需要的最少字符数量 // 给定一个由’[‘、’]‘、’(‘&#xff0c;’)‘组成的字符串 // 请问最少插入多少个括号就能使这个字符串的所有括号正确配对 // 例如当前串是 “([[])”&a…

【触想智能】工业显示器的日常维护及分类知识分享

工业显示器不同于普通商业显示器&#xff0c;它的结构比较复杂&#xff0c;如果在使用的过程中出现产品故障&#xff0c;我们怎么处理呢?今天小编为大家介绍工业显示器日常维护以及分类方面的知识&#xff0c;希望对大家有所帮助。 1、 工业显示器整机无电。这其实是一个非常简…

2023年最新prometheus + grafana搭建和使用+gmail邮箱告警配置

一、安装prometheus 1.1 安装 prometheus官网下载地址 sudo -i mkdir -p /opt/prometheus #移动解压后的文件名到/opt/,并改名prometheus mv prometheus-2.45 /opt/prometheus/ #创建一个专门的prometheus用户&#xff1a; -M 不创建家目录&#xff0c; -s 不让登录 useradd…

新型生成式 AI 助手 Amazon Q 为 IT 专业人士与开发人员提供有力支持(预览版)

今天&#xff0c;我们发布 Amazon Q 预览版&#xff0c;这是一款专用于企业级业务的全新生成式 AI 助手&#xff0c;可根据客户的业务量身定制。 Amazon Q 为开发人员和 IT 专业人员带来了多种支持功能。现在&#xff0c;使用 Amazon Q&#xff0c;即可在亚马逊云科技上构建应…

计算机操作系统7

动态分区分配算法&#xff1a; 2.页表的逻辑地址和页内偏移量的计算 3. 两级页表 4.分段、分页管理的对比 5.传统存储方式的特征和缺点 6.虚拟存储 7.请求分页管理方式

2024世界燕窝滋补品展|上海燕博会推荐品牌天健燕窝集团-为消费者带来好燕窝!

天健燕窝集团拥有27年燕窝进出口贸易经验。是最早加入经营正规燕窝业务的企业之一&#xff0c;业务范围遍布全中国&#xff0c;2015 年至2019 年连续5年燕窝进口量全国第一。 一年一届的世界燕窝及天然滋补品博览会暨世界滋补生态发展大会&#xff08;简称上海燕博会&#xff…