Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【滑动窗口】水果成篮(经典题目)

【滑动窗口】水果成篮(经典题目)

作者头像
利刃大大
发布于 2025-05-14 00:45:39
发布于 2025-05-14 00:45:39
4000
代码可运行
举报
文章被收录于专栏:csdn文章搬运csdn文章搬运
运行总次数:0
代码可运行

904. 水果成篮

904. 水果成篮

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

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

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

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

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:fruits = [1,2,1]
输出:3
解释:可以采摘全部 3 棵树。

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:fruits = [0,1,2,2]
输出:3
解释:可以采摘 [1,2,2] 这三棵树。
如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。

示例 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:fruits = [1,2,3,2,2]
输出:4
解释:可以采摘 [2,3,2,2] 这四棵树。
如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。

示例 4:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: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 时,窗口右侧向右移动,也就是扩大窗口,扩大到什么时候为止呢?果树类型大于 2 为止。

​ 值得注意的是,如何高效快捷的统计窗口中果树的类型,以及同种类型果树在当前窗口存在多少呢❓❓❓

​ 因为我们在收缩窗口的时候,要收缩到果树类型小于 2 才能停止。面对这种同类型数量统计问题或者是查重问题,哈希表是不二之选。因为数据范围比较小,所以我们定义一个数组来充当哈希表,以树的类型为键,转换到我们简易哈希表中就是对应下标,然后记录相同类型树的数目即可,这样子可以节省很多时间去调用哈希表的 erase

算法流程:

  1. 初始化一个数组充当哈希表 hash 来统计窗口内水果的种类和数量,初始化一个变量 count 来记录窗口中水果类型的数量;
  2. 初始化变量:左右指针 left = 0right = 0,记录结果的变量 maxlen = 0
  3. right 小于数组大小的时候,一直执行下列循环:
    • 将当前水果放入哈希表中;
    • 判断当前水果进来后,哈希表的大小:
      • 如果水果类型超过 2
        • 将左侧元素滑出窗口,并且在哈希表中将该元素的频次减一;
        • 如果这个元素的频次减一之后变成了 0,就把该元素从哈希表中删除;
        • 重复上述两个过程,直到哈希表中的大小不超过 2
    • 更新结果 maxlen
    • right++,让下一个元素进入窗口;
  4. 循环结束后,maxlen 存的就是最终结果。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int count = 0;	// 窗口中水果类型的数量
        int left = 0;
        int maxlen = 0;
        int hash[100001] = { 0 }; // 哈希表,用于存放窗口中水果类型以及个数
        for(int right = 0; right < fruits.size(); ++right)
        {
            // 进窗口
            if(hash[fruits[right]] == 0) // 只有没出现过的水果才count++
                count++;
            hash[fruits[right]]++; // 出现次数++
			
            // 出窗口
            while(count > 2)
            {
                hash[fruits[left]]--;
                if(hash[fruits[left]] == 0)
                    count--;
                left++;
            }
			
            // 更新结果
            maxlen = max(maxlen, right - left + 1);
        }
        return maxlen;
    }
};
```![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8fcc0e74d9ed412b9407bfc8e88054f9.gif#pic_center =300x)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【优选算法】——滑动窗口——904. 水果成篮
你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。
小李很执着
2024/06/15
1270
【优选算法】——滑动窗口——904. 水果成篮
图解LeetCode——904. 水果成篮(难度:中等)
你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。
爪哇缪斯
2023/05/10
2400
图解LeetCode——904. 水果成篮(难度:中等)
日拱算法,水果成篮问题
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情
掘金安东尼
2022/09/22
2160
日拱算法,水果成篮问题
【Leetcode】“滑” 出新天地:滑动窗口法的思路转换与问题破解
这道题来自力扣上的题目:1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)
用户11288949
2025/01/17
1140
【Leetcode】“滑” 出新天地:滑动窗口法的思路转换与问题破解
【算法一周目】滑动窗口(2)
题目描述: 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果种类。你想要尽可能多地收集水果,但是有一些规则:
HZzzzzLu
2024/12/26
920
【算法一周目】滑动窗口(2)
深入理解滑动窗口算法及其经典应用
滑动窗口技术通常用于解决子数组或子串相关的问题。其主要思想是在数组或字符串上维持一个固定的窗口大小,或在特定条件下调整窗口大小,从而在窗口内进行高效的计算。滑动窗口技术可以帮助我们在O(n)的时间复杂度内解决一些需要遍历整个数组或字符串的问题。 滑动窗口的基本步骤包括:
DevKevin
2024/08/29
3870
【优选算法题练习】day5
904. 水果成篮 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果: 你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。 你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。 一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。 给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。
摘星
2023/10/15
1770
【优选算法题练习】day5
水果篮一般装几种水果_one step closer水果篮子
题目链接:904水果成蓝 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果: 你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。
全栈程序员站长
2022/09/27
3520
水果篮一般装几种水果_one step closer水果篮子
深度解析算法之滑动窗口
输入 nums = [1,1,4,2,3], x = 5 输出: 2 解释 最佳解决方案是移除后两个元素,将 x 减到 0 。
Undoom
2025/04/01
970
深度解析算法之滑动窗口
【优选算法篇】踏入算法的深邃乐章:滑动窗口的极致探秘
题目描述: 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果种类。你想要尽可能多地收集水果,但是有一些规则:
半截诗
2024/10/20
1150
【优选算法篇】踏入算法的深邃乐章:滑动窗口的极致探秘
滑动窗口详解
暴力解法:枚举出所有的情况,然后判断长度和区间和,这种方法的时间复杂度最优为O(n^2)
2的n次方
2024/10/15
1330
滑动窗口详解
LeetCode 904. 水果成篮(滑动窗口)
在一排树中,第 i 棵树产生 tree[i] 型的水果。 你可以从你选择的任何树开始,然后重复执行以下步骤:
Michael阿明
2020/07/13
1.2K0
【python-leetcode904-滑动窗口法】水果成篮
在一排树中,第 i 棵树产生 tree[i] 型的水果。你可以从你选择的任何树开始,然后重复执行以下步骤:把这棵树上的水果放进你的篮子里。如果你做不到,就停下来。移动到当前树右侧的下一棵树。如果右边没有树,就停下来。请注意,在选择一颗树后,你没有任何选择:你必须执行步骤 1,然后执行步骤 2,然后返回步骤 1,然后执行步骤 2,依此类推,直至停止。你有两个篮子,每个篮子可以携带任何数量的水果,但你希望每个篮子只携带一种类型的水果。用这个程序你能收集的水果总量是多少?
西西嘛呦
2020/08/26
4500
【python-leetcode904-滑动窗口法】水果成篮
【算法专题】滑动窗口
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组[numsl, numsl + 1, …, numsr - 1, numsr] ,并返回其长度。 如果不存在符合条件的子数组,返回 0 。
YoungMLet
2024/03/01
1450
常见编程模式之滑动窗口
本系列旨在介绍编程题中最常见的 16 种模式[1]。对于每一种模式会介绍其基本原理,应用场景以及经典的例题。
口仆
2020/08/14
2.2K0
【优选算法篇】用滑动窗口解锁 5 大经典问题,轻松应对高频算法题(下篇)
接上篇:【优选算法篇】滑动窗口的艺术:如何动态调整子区间解决复杂问题(中篇)-CSDN博客
熬夜学编程的小王
2024/12/24
1150
【优选算法篇】用滑动窗口解锁 5 大经典问题,轻松应对高频算法题(下篇)
假期算法提升(带你彻底掌握滑动窗口)
呀哈喽,我是结衣。 今天我们要学习的是一种新的算法,也是一种双指针。不过他拥有一个全新的名字”滑动窗口“。
Yui_
2024/10/15
1410
假期算法提升(带你彻底掌握滑动窗口)
【双指针进阶】深入理解双指针作用——滑动窗口题型带你一网打尽!
用户11286421
2024/11/26
1200
【双指针进阶】深入理解双指针作用——滑动窗口题型带你一网打尽!
JavaScript刷LeetCode拿offer-滑动窗口
《JavaScript刷LeetCode拿offer-双指针技巧》中,简单地介绍了双指针技巧相比较单指针的优点,以及结合 Easy 难度的题目带大家进一步了解双指针的应用。
hellocoder2028
2022/11/01
3060
【优选算法篇】滑动窗口的艺术:如何动态调整子区间解决复杂问题(中篇)
接上篇:【优选算法篇】一文读懂滑动窗口:动态调整范围的算法利器(上篇)-CSDN博客
熬夜学编程的小王
2024/12/24
1940
【优选算法篇】滑动窗口的艺术:如何动态调整子区间解决复杂问题(中篇)
相关推荐
【优选算法】——滑动窗口——904. 水果成篮
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验