题解:
滑动窗口基本解题思路:
- 进窗口
- 判断
- 出窗口
- 更新结果(该步骤顺序不固定,可能在进窗口时更新结果,也可能在判断成立时更新结果,也有可能在判断条件结束之后更新结果)
本题本质上是求最长连续且重复字符不超过两种的子数组长度
滑动窗口本质上是从暴力解法优化而来的,暴力解法就是枚举出所有子数组,从中筛选出重复数字不超过两种的最长连续子数组,返回其长度即可。
此处的两个优化同前面的滑动窗口题目相同,另外本题需要使用unordered_map保证子数组中不存在超过两种的抽重复数字。
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int ans = INT_MIN;
int n = fruits.size();
unordered_map<int, int> count;
for (int left = 0, right = 0; right < n; right++)
{
count[fruits[right]] += 1;//进窗口
while (count.size() > 2)//判断
{
count[fruits[left]] -= 1;//出窗口
if (count[fruits[left]] == 0) count.erase(fruits[left]);
left++;
}
ans = max(ans, right - left + 1);//更新结果
}
return ans;
}
};