1. 题目描述
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
2. 滑动窗口分析
通常滑动窗口是用来解决字符串的问题。子串问题
- 滑动窗口,类似一个窗口,窗口里面放的是符合题目要求的值。属于双指针的一种类型
- 设置两个指针
left
和right
,并初始化两个指针都为0,窗口win
,[ left, right ) - 不断增加
right
即扩大窗口win
[left, right)。直到窗口中的字符符合题目要求。 - 窗口符合要求后,不断增加
left
即缩小窗口,直到不符合要求。同时每次增加left
,都要更新结果res
。 - 重复3、4直到right到达字符串的尾部。
3. JAVA代码
public int minSubArrayLen(int s, int[] nums) {
// // base case
if(len == 0) return 0;
// 长度为1
if(len == 1) return nums[0] == s ? 1 : 0;
// 串的长度
int len = nums.length;
// 左指针
int left = 0;
// 右指针
int right = 0;
// 窗口
int window = 0;
// 返回结果
int res = Integer.MAX_VALUE;
// 移动指针,直到右指针到达串的末尾
while(right < len)
{
// 先移动右指针,扩大窗口,让窗口符合题目要求
for(;right < len && window < s; right++)
window += nums[right];
// 移动左指针,缩小窗口,并更新返回值res
while(window >= s) {
// 更新返回值,区最小的值,
res = Math.min(res, right - left);
// 缩小窗口
window -= nums[left];
// 移动左指针
left++;
}
}
// 返回结果、并做个小判断判断是否空串
return res == Integer.MAX_VALUE ? 0 : res;
}