原题链接https://leetcode.cn/problems/fruit-into-baskets/
题目要求
示例 1:
输入:fruits = [1,2,1] 输出:3 解释:可以采摘全部 3 棵树。
示例 2:
输入:fruits = [0,1,2,2] 输出:3 解释:可以采摘 [1,2,2] 这三棵树。 如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。
示例 3:
输入:fruits = [1,2,3,2,2] 输出:4 解释:可以采摘 [2,3,2,2] 这四棵树。 如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。
示例 4:
输入:fruits = [3,3,3,1,2,1,1,2,3,3,4] 输出:5 解释:可以采摘 [1,2,1,1,2] 这五棵树。
提示:
1 <= fruits.length <= 105
0 <= fruits[i] < fruits.length
方法总结
明确题目要求:计算当前子数组长度外,还需要利用数组记录水果类型(用于进行条件判断),及此水果类型数量(隐藏)
遇到的问题
①不知道如何判断水果种类是否已存在
②数组不够大 越界
③
④
代码
int totalFruit(int* fruits, int fruitsSize){
int left=0,right=0;//类似设置快慢指针
int maxlen=0;//记录长度
int fruitstype[100000]={0};//记录水果类型
int fruitscount=0;//记录水果类型数量
//添加新数据,扩展窗口
for(;right<fruitsSize;right++){
if(fruitstype[fruits[right]]==0)//判断这种水果是否已在篮子里
{
fruitscount++;//若不在篮子内,水果类型数量加一
}
fruitstype[fruits[right]]++;//更新数据,表示right树上摘下的这种水果类型加一(保存这类型水果)
//判断并移除left数据,缩小窗口
while(fruitscount>2&&left<fruitsSize)//判断是否不符合条件
{
fruitstype[fruits[left]]--;//移除第left棵树水果类型数据
if(fruitstype[fruits[left]]==0)fruitscount--;//当这类型水果被移除后,水果类型减一
left++;
}
int colen=right-left+1;
maxlen=maxlen>colen?maxlen:colen;
}
return maxlen;
}