力扣209长度最小的子数组

题目要求我们在一个数组中找到一个最短的连续子数组,满足子数组中所有元素之和大于target,面对这种题目首先容易想到从长度为1的子数组开始遍历,一直试到有满足条件的子数组出现。而暴力的解法并不是我们想要的。

因为是要找子数组,而且要找长度最小的,因此我们需要一个指标来表示子数组的大小和位置,所以我们定义两个边界分别为start和end,left代表子数组的开始下标,right是子数组的结束下标,从而这个left和right就构成了一个窗口,这个窗口的大小随着right和left的值的变化而变化,又因为我们要找的是最小的,所以在开始的时候我们把left和right定在同一个下标,这样窗口长度则为1,若不符合条件,就让right向右移动,在判断是否满足条件,满足条件后,为了验证当前窗口是否是最小长度,我们再让left也向右移动,让窗口减小,再次判断是否满足,于此类推,同时用一个size的参数记录当前遍历发现的满足条件的最短的子数组的大小,最后用来返回。

代码如下:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int start=0;
        int end=0;
        int sum=nums[0];
        int size=0;
        while(start<=end&&end<nums.length)
        {
            if(sum<target)
            {
                end++;
                if(end<nums.length)
                sum+=nums[end];
            }
            else if(sum>=target)
            {
                if(size!=0)
                {
                    if(size==1)
                    {
                        return size;
                    }
                     size=Math.min(size,end-start+1);
                    start++;
                    sum-=nums[start-1];
                }
                else if(size==0)
                {
                    size=end-start+1;
                    start++;
                    sum-=nums[start-1];
                }
               
            }
        }
        return size;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值