滑动窗口算法实战
水果成篮


题目描述
因为只有两个篮子,每个篮子装的水果种类相同,如果从 0 开始摘,则只能摘 0 和 1 两个种类。

当我们在两个果篮都装有水果的情况下,如果再走到下一颗果树,果树的水果种类不是果篮中的任意一种,则停止采摘。所以就是要找出一块连续的区域,这个连续的区域最多有两种类型的元素,并且在所有找到的符合条件的区域中,找出长度最长的区域。
问题模型: 找出长度最长的子数组,子数组中的元素种类 <= 2。
解法:滑动窗口
- 定义 left 指针固定一个起点,然后定义 right 指针向后枚举;
- 枚举出所有合适的子数组,然后返回所有子数组中长度最长的数组。

- 模拟一个 hash 表 kinds,来统计水果出现的个数;
- 每 right 遍历一个元素,就把该元素对应的 kinds[fruits[i]]++;
- 每次改变 kinds 的元素 kinds[fruits[i]],都要判断 kinds 这个数组的有效元素个数是否小于 3。

如果想不清楚进窗口和出窗口该怎么操作,就回到暴力枚举的基础上,来模拟出进出窗口的操作:

- left = 0, right = 0; new kinds[];
- 进窗口(kinds[fruit[right]]++, right++)


















