解题思路
使用滑动窗口求解,分别设置left指针和right指针指向窗口两边。
核心是如何更新窗口的起始位置
- 寻找到第二种水果第一次出现的位置(中间不包含第一种水果),即为下一次窗口更新的位置的起点。
- 实现方法:先利用right指针顺着找第三种元素出现的位置,然后将left与right同位,再利用left指针回退,逆着找到第三种元素的位置,left加一即为滑窗的新开始位置。
代码
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int n = fruits.size();
int left = 0,right = 0;
int res = 0,fruitA = fruits[0],fruitB = fruits[0];
while(right < n){
if(fruitA == fruits[right] || fruitB == fruits[right] || fruitA == fruitB){
res = max(res,right - left + 1);
if(fruitA == fruitB)fruitB = fruits[right];
right++;
}
else {
fruitB = fruits[right];
fruitA = fruits[right - 1];
for(left = right - 1;left >= 0;left--){
if(fruits[left] != fruitA && fruits[left] != fruitB)break;
}
left++;
}
}
return res;
}
};