# LC 904. Fruit Into Baskets
### [Problem link](https://leetcode.com/problems/fruit-into-baskets/)
###### tags: `leedcode` `medium` `python` `c++` `Sliding Window`
You are visiting a farm that has a single row of fruit trees arranged from left to right. The trees are represented by an integer array <code>fruits</code> where <code>fruits[i]</code> is the **type** of fruit the <code>i<sup>th</sup></code> tree produces.
You want to collect as much fruit as possible. However, the owner has some strict rules that you must follow:
- You only have **two** baskets, and each basket can only hold a **single type** of fruit. There is no limit on the amount of fruit each basket can hold.
- Starting from any tree of your choice, you must pick **exactly one fruit** from **every** tree (including the start tree) while moving to the right. The picked fruits must fit in one of your baskets.
- Once you reach a tree with fruit that cannot fit in your baskets, you must stop.
Given the integer array <code>fruits</code>, return the **maximum** number of fruits you can pick.
**Example 1:**
```
Input: fruits = [1,2,1]
Output: 3
Explanation: We can pick from all 3 trees.
```
**Example 2:**
```
Input: fruits = [0,1,2,2]
Output: 3
Explanation: We can pick from trees [1,2,2].
If we had started at the first tree, we would only pick from trees [0,1].
```
**Example 3:**
```
Input: fruits = [1,2,3,2,2]
Output: 4
Explanation: We can pick from trees [2,3,2,2].
If we had started at the first tree, we would only pick from trees [1,2].
```
**Constraints:**
- <code>1 <= fruits.length <= 10<sup>5</sup></code>
- <code>0 <= fruits[i] < fruits.length</code>
## Solution 1 - Sliding Window
#### Python
```python=
class Solution:
def totalFruit(self, fruits: List[int]) -> int:
d = defaultdict(int)
res = 0
start = 0
for idx, val in enumerate(fruits):
d[val] += 1
while len(d) > 2:
d[fruits[start]] -= 1
if d[fruits[start]] == 0:
del d[fruits[start]]
start += 1
res = max(res, idx - start + 1)
return res
```
#### C++
```cpp=
class Solution {
public:
int totalFruit(vector<int>& fruits) {
unordered_map<int, int> cnt;
int ans = 0;
int l = 0;
for (int r = 0; r < fruits.size(); r++) {
cnt[fruits[r]]++;
if (cnt.size() > 2) {
cnt[fruits[l]]--;
if (cnt[fruits[l]] == 0) {
cnt.erase(fruits[l]);
}
l++;
}
ans = max(ans, r - l + 1);
}
return ans;
}
};
```
>### Complexity
>| | Time Complexity | Space Complexity |
>| ----------- | --------------- | ---------------- |
>| Solution 1 | O(n) | O(1) |
## Note
題目轉一下就變成最多兩個不同字母的最長子字串長度, 跟LC 159基本一樣.