1. 题目
在一排树中,第 i 棵树产生 tree[i] 型的水果。
你可以从你选择的任何树开始,然后重复执行以下步骤:
- 把这棵树上的水果放进你的篮子里。如果你做不到,就停下来。
- 移动到当前树右侧的下一棵树。如果右边没有树,就停下来。
请注意,在选择一颗树后,你没有任何选择:你必须执行步骤 1,然后执行步骤 2,然后返回步骤 1,然后执行步骤 2,依此类推,直至停止。
你有两个篮子,每个篮子可以携带任何数量的水果,但你希望每个篮子只携带一种类型的水果。
用这个程序你能收集的水果总量是多少?
示例 1:
输入:[1,2,1]
输出:3
解释:我们可以收集 [1,2,1]。示例 2:
输入:[0,1,2,2]
输出:3
解释:我们可以收集 [1,2,2].
如果我们从第一棵树开始,我们将只能收集到 [0, 1]。示例 3:
输入:[1,2,3,2,2]
输出:4
解释:我们可以收集 [2,3,2,2].
如果我们从第一棵树开始,我们将只能收集到 [1, 2]。示例 4:
输入:[3,3,3,1,2,1,1,2,3,3,4]
输出:5
解释:我们可以收集 [1,2,1,1,2].
如果我们从第一棵树或第八棵树开始,我们将只能收集到 4 个水果。提示:
1 <= tree.length <= 40000
0 <= tree[i] < tree.length
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/fruit-into-baskets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
类似题目:
LeetCode 424. 替换后的最长重复字符(滑动窗口)
- 滑动窗口,窗口内的水果种类数最多2种
- 窗口右端点一直向右扩大,左端点在水果种类 > 2种时,向右移动
class Solution {
public:int totalFruit(vector<int>& tree) {unordered_map<int,int> m;int i = 0, j = 0, n = tree.size(), maxf = 0;while(j < n){if(m.size() > 2)//水果大于2种{m[tree[i]]--;//左端丢弃if(m[tree[i]]==0)m.erase(tree[i]);//计数为0,删除i++;}m[tree[j]]++;//右端点加入if(m.size() <= 2)maxf = max(maxf, j-i+1);j++;}return maxf;}
};
360 ms 57.4 MB