算法——长度最小的子数组(leetcode209)

首先题目明确给出一个含有n个正整数的数组和一个目标值我们需要求出数组中下标连续的子数组元素之和大于等于目标值的最小子数组并返回。

明确题目大意后我们最容易想到的还是用两层for循环(外层for循环确定子数组的起始位置,内层for循环来确定终止位置并枚举起始位置至终止位置的数组的各种子数组的情况)然后筛选出符合题意的长度最小子数组并返回这种解法虽然思路较为简单但时间复杂度较高如果想要进一步优化时间复杂度的话我们可以使用滑动窗口的思想也就是双指针解法

双指针我们只需要使用一层for循环即可但要明确for循环中自增变量j的含义如果我们将j表示为起始位置的话那么求长度最小的子数组还是要遍历后续元素实质上和双层for循环是相似的所以我们将j定义为终止位置的指针,i表示起始位置的指针如果i至j这个子数组区间内的元素和大于等于目标值那么起始位置指针+1向右移动同时取符合条件的最小子数组的长度如此当for循环结束之后我们就可以得到长度最小的子数组长度并返回

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum=0;
        int result=Integer.MAX_VALUE;
        int i=0;
        for (int j = 0; j < nums.length; j++) {
            sum+=nums[j];
            while(sum>=target){
                if(result>j-i+1){
                    result=j-i+1;
                }
                sum-=nums[i];
                i++;
            }
        }
        return result==Integer.MAX_VALUE?0:result;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值