题目链接
解题思路
- 其实就是求只包含两种元素的最长连续子序列,使用双指针,最大滑动窗口法
- 第一个篮子(左篮子)里面装的是慢指针代表的水果种类,第二个篮子(右篮子)代表快指针的水果种类
- 以
1, 2, 3, 2, 2
为例,当有新种类的水果进入窗口时,有三种情况:
- 如果窗口中只有一种水果,那么就将这种水果加入右篮子。
- 如果已经有两种水果了,那么就更新慢指针,然后将左篮子子装较新的水果,右篮子装新水果
- 当前窗口为
1, 2
,现在进来3
, 则窗口更新为2, 3
- 如果这是已经出现在左右篮子中的水果,那么就更新一下右篮子的指针
- 当前窗口为
2, 3
,现在进来2
,则窗口更新为2, 3, 2
- 终止条件是没有新种类的水果进来,也就是快指针走到数组末端。最后选择最大的窗口长度,即为答案。
AC代码
class Solution {
public int totalFruit(int[] fruits) {
int slow = 0;
int fast = 0;
int ans = 0;
int leftBasket = fruits[slow];
int rightBasket = fruits[fast];
for (fast = 0; fast < fruits.length; fast++) {
if (fruits[fast] != leftBasket && fruits[fast] != rightBasket) {
slow = fast - 1;
leftBasket = fruits[slow];
while (slow >= 1 && fruits[slow - 1] == leftBasket) {
slow--;
}
rightBasket = fruits[fast];
}
ans = Math.max(ans, fast - slow + 1);
}
return ans;
}
}