长度最小的子数组

题目链接:209. 长度最小的子数组 - 力扣(LeetCode)

题目:
给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0。
对于这道题我们可以使用滑动窗口来写,定义一个sum来存储子数组的值,reslut用来定义一个较大的值,因为我们后面要拿它进行比较大小,然后定义两个指针,j在前面遍历数组,sum用来把j遍历数组的值加起来,也就是我们的子数组,它是用来和我们的target比大小,当sum的值加起来大于等于target的时候,这个时候就是存在长度最小的子数组,我们可以使用Math.min()计算出最小值,子数组的长度该怎么计算呢,我们可以使用数组末尾减去数组开始,但数组的索引是从0开始的,所以我们还需要加1,就变成了j-i+1,。那么找出来过后,我们是不是需要考虑sum的值,是不是需要把它前面加的值都减去,如果不减去的话,sum的值会一直增大,后面就会一直比较,但它会选择我们第一次满足sum>target条件的数组长度,因为如果这么循环下去的话,我们的数组长度是越来越长的,再继续比大小就没有什么意义了,所以可以写成sum-=num[i++];然后再后面选择一个比较大的数和数组长度进行比大小就行了,如果等于那个大值就是不存在符合条件的子数组返回0,否则返回子数组长度,这个就是长度最小的子数组了。
附上代码:

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){
                result=Math.min(result,j-i+1);
                sum-=nums[i];
                i++;
            }
        }
        return result ==Integer.MAX_VALUE ? 0:result;
    }
}

 

posted @ 2024-03-19 20:25    阅读(14)  评论(0)    收藏  举报