209. 长度最小的子数组(一般)

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例 1:

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

示例 2:

1
2
输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

1
2
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum

思路:

滑动窗口

代码1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public int minSubArrayLen(int target, int[] nums) {
//要求是子数组,也就是子串,所以很明显就是滑动窗口
int left = 0,right = 0;
int minlen = Integer.MAX_VALUE;
int tmp = target;
while (right<nums.length){
tmp = tmp-nums[right++];
//System.out.println("tmp"+tmp);
while(tmp<=0){
minlen = Math.min(minlen,right-left);
tmp = tmp + nums[left++];
}

//如果结果是小数,left++
//并将原left位置的数放回目标值中
}
// System.out.println(minlen);
return minlen==Integer.MAX_VALUE?0:minlen;
}
}