读题和示例:可转化为求一个最长的子数组,它的数字(水果)种类要? <=2.
解法:同向双指针————>滑动窗口
思路:因为要记录数字(水果)种类,因此需要一个哈希表来做一个下标的映射————>用来存放数字(水果)是何种种类,还需要一个变量记录已有的种类个数。
滑动窗口步骤:
1.left = 0,right = 0.
2.进窗口————>kind[fruits[right]]++
3.判断————>kinsum是否符合要求
4.出窗口+重复判断————>kind[fruits[left]]--
5.更新结果————> 取一个更大的len
class Solution
{
public:
int totalFruit(vector<int>& fruits)
{
int kind[100000] = {0};
int len = 0,kindsum = 0;
for(int left = 0,right = 0;right<fruits.size();)
{
//先判断是因为哈希表中此位置为0时,代表没有这个种类
//因此种类需要++
if(kind[fruits[right]]==0)
{
kindsum++;
}
//1.进窗口
kind[fruits[right]]++;
//2.判断
while(kindsum > 2)
{
//3.出窗口
kind[fruits[left]]--;
//一个数出去后,那个位置重新变为0时,代表这个种类没有了
//因此这个需要--
if(kind[fruits[left]]==0)
{
kindsum--;
}
left++;
}
//4.更新结果
len = max(len,right - left + 1);
right++;
}
return len;
}
};