# 长度最小的子数组 给定一个含有`n`个正整数的数组和一个正整数`s` ,找出该数组中满足其和` ≥ s`的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回`0`。 ## 实例 ``` 输入: s = 7, nums = [2,3,1,2,4,3] 输出: 2 解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。 ``` ## 题解 ```javascript /** * @param {number} s * @param {number[]} nums * @return {number} */ var minSubArrayLen = function(s, nums) { if(!nums.length) return 0; var start=0, end=0; var sum = 0; var target = Infinity; while(start < nums.length){ if( sum < s && end < nums.length){ sum += nums[end++]; }else{ if(sum >= s && target > (end - start)) target = end - start; sum -= nums[start++]; } } return target === Infinity ? 0 : target; }; ``` ## 思路 采用双指针的方式,构成一个动态的滑动窗口,其中`start`为首指针,`end`为尾指针,`Infinity`是一个表示无穷大的数值,初始时窗口大小为`0`,`sum`为`0`则尾指针右移,然后继续循环,当`sum < s`的时候尾指针不断右移,因为窗口间的值一直小于给定的`s`,只有尾指针右移扩大窗口才有可能使窗口间的值的和大于等于`s`,当窗口间值的和大于`s`时,那么就使首指针右移用以减小窗口的数量,只有不断减少窗口的数量才能获得长度最小的连续子数组,当尾指针达到边界条件即尾指针超过了`nums`数组的长度,那么尾指针不再右移,此时将首指针不断右移,直到首指针的长度与`nums`数组的长度相等,结束循环,在最后判断`target`是否仍然等于无穷大,如果仍然是等于无穷大则认为没有找到合适的子数组长度并返回`0`,否则就返回`target`。 ## 每日一题 ``` https://github.com/WindrunnerMax/EveryDay ``` ## 题源 ``` https://leetcode-cn.com/problems/minimum-size-subarray-sum ```