三分钟彻底解决滑动窗口

滑动窗口的关键有四个点,这四点构成了一个滑动窗口

滑动窗口的左边 left
滑动窗口的右边 right
滑动窗口的数值 即 滑动窗口内元素数值之和
滑动窗口的大小 right - left + 1

滑动窗口的使用

right先动,遍历数组,控制滑动窗口的移动
同时 sum 计算滑动窗口内的数值的大小
当 sum 大于给定的数值 target 的时候,这时候要缩减滑动窗口内的数值的大小
比较 result 大小和 len 的大小,确定 result 的长度是最小的连续子数组的长度
当 sum 大于 target 的时候,就要移动 left

left 如何移动?
通过删除sum中 left 处的元素
同时left++,来移动left位置,这时候就完成了对滑动窗口的大小和数值的缩小
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        // 滑动窗口的左边
        int left = 0;
        // 滑动窗口的数值
        int sum = 0;
        int result = Integer.MAX_VALUE;
        // 通过 right 来遍历数组
        for(int right = 0; right < nums.length; right++) {
            // right 往右移动, 滑动窗口内数值变大
            sum += nums[right];
            // 当滑动窗口内的数值大过 target 的时候,开始移动 left 来缩减数值
            while(sum >= target) {
                // 记录滑动窗口长度
                int len = right - left + 1;
                // 当滑动窗口中的大小大于 result 的时候,将其替代
                result = result < len ? result : len;
                // 减去滑动窗口最左边的元素
                sum -= nums[left++];
            }
        }
        // 当整个数组都遍历完毕之后,来比较是否 result 是否还是原来那个值,是的话说明数值之和没有超过 s,即不存在符合条件的子数组
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值