https://leetcode-cn.com/problems/fruit-into-baskets/
点击查看【bilibili】

题目

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

把这棵树上的水果放进你的篮子里。如果你做不到,就停下来。
移动到当前树右侧的下一棵树。如果右边没有树,就停下来。
请注意,在选择一颗树后,你没有任何选择:你必须执行步骤 1,然后执行步骤 2,然后返回步骤 1,然后执行步骤 2,依此类推,直至停止。

你有两个篮子,每个篮子可以携带任何数量的水果,但你希望每个篮子只携带一种类型的水果。

用这个程序你能收集的水果树的最大总量是多少?
提示:

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

    示例

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

    解答

    滑动窗口
    image.png
    image.png
    使用map优化代码,记录每个值的位置,更新j的时候,为最小位置+1
    image.png

    答案

    1. var totalFruit = function(tree) {
    2. const map = new Map()
    3. let max = 1;
    4. let j = 0;
    5. for(let i=0;i<tree.length;i++) {
    6. map.set(tree[i],i)
    7. // 当水果篮中的水果类型大于两种
    8. if(map.size > 2) {
    9. // 定义一个比较大的数,找到最小的数
    10. let minIndex = tree.length-1
    11. for(const [fruit,index] of map) {
    12. if(index < minIndex) {
    13. minIndex = index
    14. }
    15. }
    16. map.delete(tree[minIndex])
    17. j = minIndex +1
    18. }
    19. max = Math.max(max, i-j+1)
    20. }
    21. return max
    22. };