【leetcode】滑动窗口模板

适用题目关键词:

满足...条件最长/短(子)字符串

思路:

核心:

  • RL双指针,起始位置,R指针向右逐位滑动循环
  • RL指针间形成窗口

滑动:

1寻找满足条件的最长子串

  • if(窗口内元素满足条件):R继续向右扩大窗口,L不动,更新最优结果
  • if(不满足条件):L向右滑动至R位置,缩小窗口

2寻找满足条件的最短子串

  • if(窗口内元素满足条件):L继续向右缩小窗口,R不动,更新最优结果
  • if(不满足条件):R向右滑动扩大窗口

结束:

  • R到达结尾

模板:

初始化双指针L,R,result,bestResult

while(R<end){

    //寻找最长子串    
    扩大窗口:加入R对应元素,更新当前result
    while(result不满足条件)
        {
            缩小窗口:L右移
        }
    更新bestResult

    //寻找最短子串
    扩大窗口:加入R对应元素,更新当前result
    while(result满足条件)
        {
            更新bestResult
            缩小窗口:L右移
        }
    

    R++
}

返回bestResult

实例:

leetcode 209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

public class Solution {
    public int MinSubArrayLen(int target, int[] nums) {
        //初始化双指针
        int r=0,l=0,minL=0,sum=0;
        int len= nums.Length;
        //滑动窗口
        while(r<len){
            //记录当前结果
            sum+=nums[r];
            //满足条件,缩小窗口
            while(sum>=target){
                //更新min
                if(r-l+1<minL||minL==0)
                minL=r-l+1;
                //缩小窗口
                sum-=nums[l];
                l++;            
            }
        r++;
        }
        return minL;
    }
}

参考:

精心总结滑动窗口代码模板, 直接搞定80道Leetcode算法题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值