209.给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组

例:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组[4,3] 是该条件下的长度最小的子数组。
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

最直观的我们想到暴力法,但是这种方法时间复杂度高。

为了减少时间复杂度,我们消除两层for循环的方法就是设置两个指针【滑动窗口】。

此题中我们分别设置两个指针指向子数组的起始位置(low)和结束位置(high)。外层的循环来判断结束位置的指针。

如果从low到high的子数组之和大于等于target,就让low指针右移,在此过程中记录子数组的最小长度。

直到子数组之和小于target。让high指针右移。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int low=0;
        int high=0;
        int sum=0;
        int result=Integer.MAX_VALUE;
        int sublength;
        while(high<nums.length){
            sum+=nums[high];
            high++;
            while(sum>=target){
                sublength=high-low;
                result=result>sublength?sublength:result;
                sum-=nums[low];
                low++;
            }        

        }
        return result == Integer.MAX_VALUE ? 0 : result;
        
        

    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值