leecode 904.水果成篮 双指针滑动窗口算法

【LeetCode】图解 904. 水果成篮 此时,我们已经更新了map中两种水果的最后出现位置,也更新了存储的水果最大数量(计算水果的最大数量可以使用:i - j + 1),接下来当我们继续向后移动指针时,出现了第三种水果,此时需要我们取出一种水果,根据下标,我们要取出的水果是1号水果,并且更新j指针的位置为下标为 6+1 的地方。此时,i指向的是1号水果,j指针指向的是我们的第一种水果,在map中,3号水果的最后出现位置为下标为2的地方,1号水果出现的位置在下标为3的位置,并且记录当前的采摘的最大数量为4。采摘的水果应当符合篮子中的水果类型。... 阅读详情

leecode 904.水果成篮

水果成篮

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。

你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:

  • 你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
  • 你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
  • 一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。

给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。

示例 1:

输入:fruits = [1,2,1]
输出:3
解释:可以采摘全部 3 棵树。

示例 2:

输入:fruits = [0,1,2,2]
输出:3
解释:可以采摘 [1,2,2] 这三棵树。
如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。

示例 3:

输入:fruits = [1,2,3,2,2]
输出:4
解释:可以采摘 [2,3,2,2] 这四棵树。
如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。

示例 4:

输入:fruits = [3,3,3,1,2,1,1,2,3,3,4]
输出:5
解释:可以采摘 [1,2,1,1,2] 这五棵树。

提示:

  • 1 <= fruits.length <= 105
  • 0 <= fruits[i] < fruits.length

题解:

算法思路:

研究的对象是⼀段连续的区间,可以使⽤「滑动窗⼝」思想来解决问题。

让滑动窗⼝满⾜: 窗⼝内⽔果的种类只有两种。

做法:右端⽔果进⼊窗⼝的时候,⽤哈希表统计这个⽔果的频次。这个⽔果进来后,判断哈希表的⼤⼩:

​ ▪ 如果⼤⼩超过 2:说明窗⼝内⽔果种类超过了两种。那么就从左侧开始依次将⽔果划出窗⼝,直到哈希表的⼤⼩ 于等于 2,然后更新结果;

​ ▪ 如果没有超过 2,说明当前窗⼝内⽔果的种类不超过两种,直接更新结果 ret。

算法流程:

​ 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(int[] f) {
        int n = f.length;
        int[] hash = new int[n + 1];
        int ret = 0;
        for(int l = 0, r = 0, kinds = 0; r < n; r++) {
            int in = f[r];
            if(hash[in] == 0) {
                kinds++;
            }
            hash[in]++;
            while(kinds > 2) {
                int out = f[l++];
                hash[out]--;
                if(hash[out] == 0) {
                    kinds--;
                }
            }
            ret = Math.max(ret, r - l + 1);
        }
        return ret;
    }
}
Agent本地部署教程详细步骤 在开始之前,你需要明确你要部署的Agent是什么。如果你需要部署其他Agent,请参考其官方文档调整步骤。 阅读详情

相关推荐

安装cartographer,跑官网数据集

今天开始写一个关于google cartographer系列文章。此类文章网上已经很多,本系列文章主要记录重点部分及容易踩坑地方。 cartographer是一个完整的激光SLAM开源项目,属于graph slam,包含了完整的前端里程计和后端地图优化,既能够同时定位建图,又能够基于先验地图进行独立全局定位。 值得 目录 一、推荐首选看官网资料,已经很详细了 二、安装 三、源码文件架构 四、跑数据集 1、建图 2、基于先验地图的全局定位 一、推荐首选看官网资料,已经很详细了 原生版:

qq_18276949的博客 6144

题目地址(904. 水果成篮)

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果: 你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。 你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘

y1040468929的博客 546

Windows 本地安装 OpenClaw(龙虾)完整教程(纯净无广告)

《Windows系统OpenClaw本地AI网关安装指南》 本文提供Windows 10/11系统下OpenClaw(龙虾)AI网关的完整部署教程,包含: 环境配置:Node.js安装验证 核心安装:npm全局部署OpenClaw 模型对接:以DeepSeek为例配置API 扩展功能:飞书机器人集成方法 日常管理:启停命令/Web面板访问 卸载清理:完整移除服务与残留 教程涵盖初始化配置、技能管理、常见问题排查,特别说明管理员权限要求及飞书配对流程,适合新手30分钟内完成本地AI网关搭建。通过命令行操作与W

qiuxunbin_csdn的博客 641

LeetCode904. 水果成篮

本文为LeetCode904. 水果成篮的解析,欢迎参考或提出建议,期待您的关注!

Toby的博客 799

TNS-12516及ORA-12516错误解决

在客户端进行sqlplus连接报错如下: ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程序 在/home/oracle/product/10.2.0/db_1/network/log/listener.log中查看到错误如下: TNS-12516: TNS:listener could not find available handler with matchin

KEL 2万+

YOLOv11改进 | 特殊场景检测篇 | 低照度图像增强网络SCINet改进黑暗目标检测(全网独家首发)

本文给大家带来的改进机制是低照度图像增强网络SCINet,SCINet(自校正照明网络)是一种专为低光照图像增强设计的框架。它通过级联照明学习过程和权重共享机制来处理图像,优化了照明部分以提升图像质量。我将该网络集成在YOLOv11的主干上针对于图像的输入进行增强,同时该网络的并不会增加参数和计算量,基本和普通的网络结构保持一致,同时该结构支持自定义调节层数,来控制图像增强的效果 ,非常适合想要在黑夜目标检测领域发表文章的读者,该基本网络不会影响模型的速度。欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 2207

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

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

q322359的博客 1307

VisionPro 机器视觉案例 之 彩色保险丝个数统计

CogColorSegmenterTool CogColorMatchTool

机器视觉李小白的博客 2353

Leetcode每日刷题之904.水果成篮

【代码】Leetcode每日刷题之904.水果成篮。

2301_80689220的博客 749

从 CDS 接口到 ABAP 运行时,深入理解 SAP RAP Custom Entity

CDS Custom Entity 是一种非 SQL、瞬态的 CDS 实体,不依赖 HANA SQL 读取数据,而是通过 ABAP 类实现查询逻辑(如 RFC、OData、BAPI 等)。它在 CDS 层定义数据契约(字段、键、关联、注解),由 @ObjectModel.query.implementedBy 指向实现 IF_RAP_QUERY_PROVIDER~SELECT 的类,真正执行数据获取。适用于无法用 SQL 表达的数据源,如远程系统或 API。其核心是“接口 + 实现”模式,运行时由 RAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 171

【ACP】2025-最新-疑难题解析- 练习二汇总

全球加速是优化公网访问的,负载均衡是分发流量的,公网 NAT 网关是处理公网 IP 的,高速通道是建私网连接但不直接提供固定私网地址功能。C 是客户端加密方式,D 是 ECS 云盘加密,都不属于 OSS 服务器端加密。某企业想使用云服务器 ECS + 负载均衡 SLB + 弹性伸缩 (Auto Scaling) 的架构搭建一个企业级门户网站,技术负责人对于负载均衡和弹性伸缩配合使用没有经验,于是将他理解的两种产品配合使用的一些技术细节列成了一个表单,并请作为架构师的您帮他做一下鉴别,以下哪些项是正确的?

jundao1997的专栏 296

《算法闯关指南:优选算法--滑动窗口》--13水果成篮

【算法实战:滑动窗口解水果成篮问题】博主草莓熊Lotso分享力扣904题解法,通过滑动窗口处理连续区间问题。当窗口内水果种类超过2种时,左指针右移调整窗口,利用哈希表统计频次,最终求出最大区间长度。提供C++两种实现:容器版和数组模拟哈希表版,并附算法思路图解。关键词:滑动窗口、哈希表、双指针、区间处理。

会当凌绝顶,一览众山小 1428

学Simulink--基础微电网场景实例:基于Simulink的微电网黑启动过程建模与仿真

黑启动(Black Start)是指在全系统停电(无电压、无频率)状态下,微电网依靠内部电源自主恢复供电的能力。🌩️典型场景主网长时间故障自然灾害导致区域停电计划检修后重启❗挑战无参考电压/频率 → 逆变器无法锁相负荷逐级投入 → 需避免过流/过压多电源协调 → 防止环流或失步✅黑启动成功标准在30 秒内恢复关键负荷供电电压/频率稳定在范围内无设备损坏或保护跳闸🎯本文目标:手把手教你使用 Simulink + Simscape + Stateflow 搭建。

amy_mhd的博客 201

【LeetCode】滑动窗口_水果成篮_C++

本文介绍了一个滑动窗口算法解决LeetCode 904题"水果成篮"问题。

2501_90654211的博客 1590

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

力扣904 水果成篮--滑动窗口+哈希表

unordered_map函数,我简单一点理解就是哈希表,详细可以参考滑动窗口的重要性是确定起始指针跟终止指针的位置,用一个for循环解决两个for循环的问题(类似于双指针)

qq_62035394的博客 1270

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【优选算法必刷100题】第013题(滑动窗口):水果成篮问题

本文介绍了使用滑动窗口算法解决LeetCode 904题"水果成篮"问题。该算法通过维护一个最多包含两种水果类型的窗口,利用哈希表统计水果频次。当窗口内水果种类超过2种时,左指针右移调整窗口,直到满足条件。文章详细讲解了算法思路和流程,并提供了C++代码实现(包括容器版和数组模拟哈希表版)。该解法时间复杂度为O(n),空间复杂度为O(1),是处理连续区间问题的经典滑动窗口应用案例。

心向往之,行必能至 799

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LeetCode 904:水果成篮(滑动窗口) —— 题解

滑动窗口——水果成篮

2601_96587588的博客 587

LeetCode 904 水果成篮

LeetCode 904 水果成篮 这是一道双指针的题,很有意思。 class Solution { public int totalFruit(int[] tree) { int len = tree.length; HashMap<Integer, Integer> hashmap = new HashMap<>(); ...

qq_29453229的博客 262

优选算法题-水果成篮

滑动窗口算法是一种高效处理连续子序列问题的技巧,通过两个指针维护动态窗口,将暴力解法优化到线性时间复杂度。其核心思想包括:1)用双指针减少状态记录,避免重复计算;2)根据问题需求动态调整窗口大小,分为固定和可变两种类型;3)单次遍历序列实现高效处理。以"水果成篮"问题为例,算法通过哈希表统计水果种类,右指针扩张窗口,左指针收缩窗口保证种类不超过2,同时记录最大窗口长度。该算法能有效解决多种子序列问题,如最长无重复子串等,具有较高的通用性和效率。

2302_81265429的博客 847

LeetCode每日一题——904. 水果成篮

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果: 你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。 你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘

hyk的博客 698

滑动窗口(水果成篮)(5)

滑动窗口(水果成篮)

2601_95366422的博客 711

leetcode【滑动窗口】相关题目分析讲解:leetcode209,leetcode904

滑动窗口是算法中非常经典的一个部分。本文将从基础的滑动窗口入手,分析讨论如何完成初、中级别的滑动窗口变种题目,强化对于本类题型的思维与理解。

weixin_47510148的博客 1005

【滑动窗口】水果成篮

随后暴力解法会从起点1(第二个3)和起点2(第三个3)重新开始遍历。但这两个起点的初始水果都是3,与起点0的核心组合(3和1)完全一致,因此其遍历结果必然比起点0更短,属于可跳过的无效计算。以起点0(第一个3)为例:遍历到位置4(水果2)时,篮子里已包含3、1、2三种水果,此时停止遍历,有效长度为4(对应子数组[3,3,3,1])。优化无效起点的处理(避免重复遍历第二个/第三个3) 从起点0遍历至right=4(水果2)时发现非法情况,最后合法位置为fruits[3]=1。时间复杂度为:O(N)

prettyxian的博客 706

LeetCode - 904. 水果成篮

【摘要】题目"水果成篮"要求在整数数组中找到最长的连续子数组,其中最多包含两种不同的数字(水果种类)。采用滑动窗口法,用双指针标记窗口边界,哈希表统计水果种类。当种类超过2时收缩左边界,直至窗口合法。常见错误是未及时删除哈希表中计数为0的水果种类,导致统计错误。正确解法需在减少计数后检查并删除零值项,同时移动左指针。时间复杂度为O(n),空间复杂度O(1)。示例代码展示了正确处理逻辑,确保窗口内始终不超过2种水果,并动态更新最大长度。

2402_83315537的博客 518

代码随想录 | LeetCode904水果成篮、LeetCode76最小覆盖子串

1.快指针是导致滑动窗口合法性丧失的罪魁祸首2.慢指针是使得滑动窗口重新合乎条件的帮手3.快慢指针共同维护一个有条件的滑动窗口。

兑现自己能兑现的天赋吧 1034

LeetCode算法日记 - Day 7: 水果成篮、找到字符串中所有字母异位词

文章摘要:本文介绍了两个滑动窗口算法的经典应用。第一个是"水果成篮"问题,要求从一排果树中连续采摘最多两种水果,通过双指针和哈希表记录水果种类,维护最多两种水果的滑动窗口来求解。第二个是"字母异位词"问题,通过比较两个字符串的字符频率来寻找异位词子串,使用固定大小的窗口和字符计数数组进行匹配。两个问题都展示了滑动窗口算法在连续区间问题中的高效应用,分别给出了数组模拟哈希表和哈希表实现的两种解决方案。

Miraitowa_cheems的博客 1081
上一篇: 力扣1004题 最大连续1的个数 III 滑动窗口
下一篇: leecode 438.找到字符串中所有字母异位词 滑动窗口
m0_73594607
博客等级 码龄4年 121粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是布谷阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值