首页 分享 题解:农场采摘水果问题

题解:农场采摘水果问题

来源:花匠小妙招 时间:2025-09-27 10:29

题目解析

附上题目链接 344 农场采摘水果问题

这道题的核心是通过滑动窗口的技巧,在整数数组中找到满足题目条件的最长子数组长度。题目本质是一个经典的双指针问题,利用滑动窗口机制对数组进行动态调整,以满足每次操作的时间复杂度尽可能低。

我们将每个水果类型视作一个集合元素,数组代表这些元素的排列。小U的限制是只能携带两个篮子,因此滑动窗口需要控制在两种类型的水果内。这意味着我们需要一个动态数据结构来记录窗口内的水果种类及其数量,方便窗口的扩展和收缩。

解题思路

1. 数据结构选择

我们选择使用**哈希表(HashMap)**来存储滑动窗口内的水果种类和数量,其中:

• 键:表示水果种类;

• 值:表示该种类水果在当前窗口中的数量。

哈希表的选择是基于其对键值对的插入、删除和访问操作具有 O(1) 时间复杂度的优势。

2. 滑动窗口策略

滑动窗口本质上是通过两个指针(左指针 i 和右指针 j)界定数组的子区间:

右指针 j:不断向右扩展窗口,尝试将当前树上的水果加入篮子;

左指针 i:当窗口内水果种类超过两个时,开始收缩窗口,直至重新满足题目条件。

3. 动态维护窗口

窗口的维护分为两种情况:

窗口种类不超过两种:窗口可以正常扩展,并更新最大长度;

窗口种类超过两种:通过收缩左边界,移除水果直到种类数不超过两种。

4. 最终目标

每次右指针扩展时,记录窗口的长度并与当前最大值比较更新,最终返回最大值。

代码实现

import java.util.HashMap; public class Main { public static int solution(int[] fruits) { // write code here int n = fruits.length; HashMap<Integer, Integer> mymap = new HashMap<>(); int i = 0; int j = 0; int max_length = 0; for (j = 0; j < n; j++) { // 尝试将右窗口处的水果加入 if (mymap.containsKey(fruits[j])) { int cnt = mymap.get(fruits[j]); mymap.put(fruits[j], cnt + 1); } else { mymap.put(fruits[j], 1); } if (mymap.size() <= 2) // 如果没超,就更新最大长度 { max_length = Math.max(j - i + 1, max_length); } else// 否则收缩左窗口 { while (mymap.size() > 2) { if (mymap.get(fruits[i]) > 1) { int cnt = mymap.get(fruits[i]); mymap.put(fruits[i], cnt - 1); } else { mymap.remove(fruits[i]); } i++; } } } return max_length; } public static void main(String[] args) { System.out.println(solution(new int[] { 1, 2, 1, 2 }) == 4); System.out.println(solution(new int[] { 2, 0, 1, 2, 2 }) == 3); System.out.println(solution(new int[] { 1, 2, 3, 2, 2, 4 }) == 4); } }

算法优化与复杂度分析

时间复杂度:滑动窗口中每个元素最多被访问两次(一次加入窗口,一次移出窗口),因此时间复杂度为 O(n),其中 n 是数组长度。

空间复杂度:哈希表中最多存储两种水果,因此额外空间复杂度为 O(1)。

这种线性时间复杂度的实现方式非常高效,对于大规模数据仍然能保持良好的性能。

一些Tips & 个人思考

这道题目的解决方案并不复杂,但细节上的处理和逻辑清晰度决定了实现的简洁度和鲁棒性。在实现过程中,有几个关键点值得深入思考:

滑动窗口的设计核心

滑动窗口的灵活性在于它能够动态调整范围,尤其适合处理这种子数组或者子区间问题。在设计时,我们需要注意窗口的两种状态:合法与非法。通过右指针扩展和左指针收缩实现动态调整,是滑动窗口的核心逻辑。

哈希表的应用与优化

选择哈希表记录窗口内水果种类和数量是关键。这种设计比单独用计数器更灵活,因为可以在水果种类动态变化时高效操作。如果水果种类固定为2种,简单的数组也可以完成此任务,但哈希表适应性更强。

边界条件的处理

实现过程中,数组长度可能为0或1,这些特殊情况需要单独考虑。此外,窗口收缩的条件是哈希表大小超过2时,这需要和更新最大长度的逻辑分开处理,避免逻辑混乱。

小结

通过滑动窗口和哈希表的结合,这道题可以在线性时间内高效解决,算法思路清晰,代码实现简洁。实际开发中,滑动窗口非常适合解决这类连续区间问题。解决问题的关键不在于编码本身,而是对动态调整过程的清晰理解。在面对类似问题时,学会归纳条件、分析状态转移的过程,可以更快速地设计出高效的算法。

相关知识

题解:农场采摘水果问题
豆包MarsCode AI 刷题——农场采摘水果问题
合肥三十岗桃蹊水果农场采摘攻略
合肥三十岗桃蹊水果农场桑葚采摘指南
宿迁:来生态农场 体验“一站式”采摘
深圳光明农场全年水果采摘时间一览 荔枝龙眼草莓桑葚全都有
澳洲水果采摘季节指南
佛山顺德新地休闲农场嘉宝果采摘攻略
重庆亲子黄瓜采摘基地田园派都市农场怎么样
昌乐富硒水果采摘(硒水果)

网址: 题解:农场采摘水果问题 https://www.huajiangbk.com/newsview2380049.html

所属分类:花卉
上一篇: 夏日特辑之“树根”篇
下一篇: 果然视频|无花果采摘季又来临,快

推荐分享