解题思路
使用滑动窗口求解,分别设置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;
}
};
这篇博客介绍了一种使用滑动窗口算法解决如何在一个水果数组中找到连续子数组,使得子数组内最多有两种不同类型的水果的问题。通过设置左右指针,不断更新窗口边界,寻找满足条件的最大长度。在代码实现中,详细阐述了如何更新窗口的起始位置,以及如何处理不同情况下的元素遍历。该算法展示了滑动窗口在解决数组问题上的应用。

839

被折叠的 条评论
为什么被折叠?



