力扣209题
题目描述:长度最小的子数组
给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其总和大于等于
target
的长度最小的 子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度**。**如果不存在符合条件的子数组,返回0
。
**题解思路:**力扣上暴力搜索会超时!
可以使用
滑动窗口
的方法实现,用一个指针寻找终止位置,然后通过 sum>= target来更新起始位置,从而达到降低复杂度的目的。
class Solution {
// --- 滑动窗口 ---
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
int subLen = 0;// 每次更新的数组长度
int minLen = Integer.MAX_VALUE;// 最小的子数组长度,初始时设为最大值
int start = 0;// 起始位置的下标
for (int end = 0; end < nums.length; end++) {
sum += nums[end];
while (sum >= target) {
subLen = end - start + 1;// 更新子数组的长度
minLen = subLen < minLen ? subLen : minLen;// 取最小的子数组长度
sum -= nums[start++]; // 更新 i 的位置
}
}
return minLen == Integer.MAX_VALUE ? 0 : minLen;
}
}