Leetcode904

滑动窗口的类型题,本人觉得特别难理解。花了很多时间,其实还是没有完全把逻辑搞懂,所以记录一下,以便提醒自己多反复思考。

参考了其他人的思路和代码,侵权请联系删除。

//滑动窗口解法 用滑动窗口遍历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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值