209. 长度最小的子数组

209. 长度最小的子数组

思路

连续子数组 这不就是暗示滑动窗口

滑动窗口

思路
  • 使用start、end指针,分别表示滑动窗口的起始、终止位置
  • 移动end指针,扩大窗口,直到子数组达到目标值target
  • 移动start指针,缩小窗口,直到子数组不再满足>=target
上代码
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        //选最大值是为了选一个规范,最后看result是否改变(见return语句)
        int result = Integer.MAX_VALUE;

        int start = 0;
        int end = 0;
        int sum = 0;

        while (end < nums.length){
            //将end处的值加入sum,然后end向后移
            sum += nums[end++];
            //如果满足要求,就将该滑块的长度与result相比较,小的存入result
            while (sum >= target && start < end){
                //长度就是end-start
                result = Math.min(result,end - start);
                //将start处的值从sum中减去,然后start后移
                sum -= nums[start++];
            }
        }
        //此处注意,三元运算符是一个表达式,不是一个语句 所以不能单独使用
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}
巧妙之处
  • 选取Integer.MAX_VALUE很巧妙,既不会重复又是一个规范
  • 三元运算符是表达式,不能作为语句单独使用(谁报错谁心里明白)
  • sum += nums[end++]巧妙的运用先运算后++

题目

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Garritsen___

希望帮助的大家

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值