【从零开始刷力扣002】leetcode209-长度最小的子数组

这道题有很多解法,但按照我的进度,我只会暴力和滑动窗口,这里重点解析滑动窗口

leetcode-209

Java版本:

class Solution {
    public int minSubArrayLen(int s, int[] nums) {
        int left = 0;
        int right = 0; // 右指针指向下一个将要加入窗口的元素
        int sum = 0;
        int result = Integer.MAX_VALUE;
        
        // 右指针遍历整个数组
        while (right < nums.length) {
            // 将当前右指针指向的元素加入窗口,然后右指针右移
            sum += nums[right++];
            
            // 当窗口内元素和大于等于目标值时,尝试收缩左边界
            while(sum >= s) {
                // 窗口区间为 [left, right),长度为 right - left
                result = Math.min(result, right - left);
                // 移除左边界元素,左指针右移
                sum -= nums[left++];
            }
        }
        
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

1.什么时候右移右指针?

答:当现在的window与target不一致时,向右移,但在第一个while中可以执行一次right++

这样保证了窗口是左开右闭。(相当于窗口内的数据范围是[le,ri)部分的数据

2.什么时候收缩,收缩几次?

答:当右移满足时,开始收缩,但收缩过程正式寻找最优解的过程,在这里可能更改result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值