滑动窗口算法

滑动窗口也是比较热门的算法之一,并且滑动算法是双指针的变种,在很多场景下均有应用

题目链接

209. 长度最小的子数组

参考题解
class Solution {
    public int minSubArrayLen(int target, int[] nums) {

        int len = nums.length;
        int j = 0;
        int sum = 0;
        int res = len+1;
        for (int i = 0; i < len; i++) {
            sum += nums[i];
            while (sum >= target) {
                res = Math.min(res, i - j + 1);
                sum -= nums[j];
                j++;
            }
        }
        if (res == len+1){
            return 0;
        }
         return res;
    }
}
滑动窗口思想

滑动窗口本质就是快慢指针,一个在前,一个在后,共同维护一个可变的区间,如下图红框所示就是一个窗口

随着指针的移动,快慢指针的区间会发生变动,但是总体上保持整体向前移动的趋势

因此滑动窗口可以解决最大子串和最小子串等相关问题

以上题为例,初始化两个指针,一个快指针一个慢指针,都指向数组的第一个元素

随着快指针移动,快慢指针之间就有一个区间,计算此区间的和,是否大于等于目标值target

如果不大于的话,则一直移动快指针,即一直扩大区间的长度

当区间内和大于等于target时,记录区间长度后则可以尝试缩小区间长度,判断缩小后的区间和是否满足条件

如果缩小区间后不满足条件,则继续移动快指针以扩大区间大小

否则,则移动慢指针缩小区间大小,每次满足条件后都需要计算区间的长度,并与上次满足条件的区间长度比较,得到最小的区间长度

如此往复,最终得到最小区间长度

参考资料

算法吧

代码随想录

熟能生巧,这种题型多练练,理解其中思想,必要时用笔在纸上画画图,更有益于理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值