题目链接

题目描述

在一排树中,第 i 棵树产生 tree[i] 型的水果。
你可以从你选择的任何树开始,然后重复执行以下步骤:

  1. 把这棵树上的水果放进你的篮子里。如果你做不到,就停下来。
  2. 移动到当前树右侧的下一棵树。如果右边没有树,就停下来。

请注意,在选择一颗树后,你没有任何选择:你必须执行步骤 1,然后执行步骤 2,然后返回步骤 1,然后执行步骤 2,依此类推,直至停止。
你有两个篮子,每个篮子可以携带任何数量的水果,但你希望每个篮子只携带一种类型的水果。
用这个程序你能收集的水果树的最大总量是多少?

示例

示例1:

输入:[0,1,2,2] 输出:3 解释:我们可以收集 [1,2,2] 如果我们从第一棵树开始,我们将只能收集到 [0, 1]。

提示

  • 1 <= tree.length <= 40000
  • 0 <= tree[i] < tree.length

    思路

    滑动窗口

    维护一个窗口 start, end ,和 counterend 不断移动并更新总量,当 counter 的大小大于 3 时,first 右移收缩窗口,并更新总量。

    题解

    滑动窗口

    1. class Solution:
    2. def totalFruit(self, fruits: List[int]) -> int:
    3. n = len(fruits)
    4. start, end = 0, 0
    5. ans = 0
    6. count = collections.Counter()
    7. while end < n:
    8. count[fruits[end]] += 1
    9. while len(count) > 2:
    10. count[fruits[start]] -= 1
    11. if count[fruits[start]] == 0:
    12. del count[fruits[start]]
    13. start += 1
    14. ans = max(ans, end - start + 1)
    15. end += 1
    16. return ans

    复杂度分析

  • 时间复杂度:0904-水果成篮 - 图1

  • 空间复杂度:0904-水果成篮 - 图2