滑动窗口的类型题,本人觉得特别难理解。花了很多时间,其实还是没有完全把逻辑搞懂,所以记录一下,以便提醒自己多反复思考。
参考了其他人的思路和代码,侵权请联系删除。
//滑动窗口解法 用滑动窗口遍历fruits 滑动窗口解法的主要就是能够控制滑动窗口的大小 什么时候改变窗口的大小
//如果窗口中只有一种水果 就将这种水果加入到arr数组中
//如果有两种水果 那么我们就要更新窗口的左边界 然后更新arr数组中水果的种类
//如果进来了一种新的类型的水果 就要更新前一种水果的位置
//然后更新滑动窗口的最大值
var totalFruits=function(fruits){
let l=0;//起始指针
let maxLen=0;//窗口的最大长度 最多包含两种水果
let n=0;//前一类水果的结束位置 就是下一个滑动窗口的左边界
let arr=[fruits[l]];//定义水果的种类数组
for(let r=0;r<fruits.length;r++){//窗口的右指针不断前进
if(!arr.includes[fruits[r]]){
if(arr,length<=1){
arr[1]=fruits[r];//直接将水果插入到arr数组中
}
else{//如果已经有两种水果
l=n;//更新窗口的左边界
}
}
if(fruits[r]!=fruits[n]){
n=r;//加入数组的水果种类是和前一类水果是不一样的时候 那么我们就需要把前一类的结束位置改变一下
}
maxLen=Math.max(maxLen,r-l+1);
}
return maxLen;
}
然后,最近在看Map的知识点,以及看了b站本题视频教程,然后利用Mao可以做到进行优化。
let map=new Map();//利用Map来存放水果树的种类,这个时候map最多只能存放两种水果树
let j=0;//定义左边界
let max=0;
for(let i=0;i<fruits.length;i++){
map.set(fruits[i],i);
let minIndex=fruits.length-1;//定义一个变量 来存放map中较小的值
if(map.size>2){//这个时候窗口就要移动 因为最多只能存放两种水果树
for(const [fruit,index] of map){
if(minIndex>index){
minIndex=index;
}
}
map.delete(fruits[minIndex]);//删除map中i值较小的
j=minIndex+1;
}
max=Math.max(max,i-j+1);
}
return max;