In a row of trees, the i-th tree produces fruit with type tree[i].

You start at any tree of your choice, then repeatedly perform the following steps:

  1. Add one piece of fruit from this tree to your baskets.  If you cannot, stop.
  2. Move to the next tree to the right of the current tree.  If there is no tree to the right, stop.

Note that you do not have any choice after the initial choice of starting tree: you must perform step 1, then step 2, then back to step 1, then step 2, and so on until you stop.

You have two baskets, and each basket can carry any quantity of fruit, but you want each basket to only carry one type of fruit each.

What is the total amount of fruit you can collect with this procedure?

Example 1:

Input: [1,2,1]
Output: 3
Explanation: We can collect [1,2,1].

Example 2:

Input: [0,1,2,2]
Output: 3
Explanation: We can collect [1,2,2].
If we started at the first tree, we would only collect [0, 1].

Example 3:

Input: [1,2,3,2,2]
Output: 4
Explanation: We can collect [2,3,2,2].
If we started at the first tree, we would only collect [1, 2].

Example 4:

Input: [3,3,3,1,2,1,1,2,3,3,4]
Output: 5
Explanation: We can collect [1,2,1,1,2].
If we started at the first tree or the eighth tree, we would only collect 4 fruits.

Note:

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

水果成篮。题目的糖衣写的很模糊,难怪这个题的downvote更多。讲的直白一点,这个题是给你一个数组,数组代表一排树,每个坐标上的值tree[i]代表树的类型。只允许你收集两种树上的果子,请问你最多能收集多少果子。实际问的是只能收集两种果子的情况下,如何能使你收集的这个子数组最长。返回的是能收集的最长的长度。比如例子三,[1,2,3,2,2],收集的是2和3两种果子,组成的最长子串的长度是4。

思路是sliding window滑动窗口,基本可以套用76题的模板。这个题基本跟159题没有区别。

时间O(n)

空间O(n)

Java实现

 1 class Solution {
 2     public int totalFruit(int[] tree) {
 3         HashMap<Integer, Integer> map = new HashMap<>();
 4         int res = 0;
 5         int left = 0;
 6         int right = 0;
 7         while (right < tree.length) {
 8             map.put(tree[right], map.getOrDefault(tree[right], 0) + 1);
 9             right++;
10             while (map.size() > 2) {
11                 map.put(tree[left], map.get(tree[left]) - 1);
12                 if (map.get(tree[left]) == 0) {
13                     map.remove(tree[left]);
14                 }
15                 left++;
16             }
17             res = Math.max(res, right - left);
18         }
19         return res;
20     }
21 }

 

sliding window相关题目

LeetCode 题目总结