题目链接
题目:
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

解题思路:
- 方法一:暴力解法
 通过两个for循环,找出所有满足和 ≥ target的情况,然后取最小值。时间复杂度为O($ n^2 $)。
 
- 方法二:滑动窗口法
 所谓的滑动窗口就是不断调节子序列的起始位置和终止位置,从而得出想要的结果。
 
模式说明:
输入是一个数组或字符串,求解的结果是具有某种特质的子数组或子字符串。这种情况下下,可以使用滑动窗口的方法求解。
应用滑动窗口的注意事项:
- 可以通过两个指针来标识窗口的边界
- 窗口的长度可固定也可改变,取决于求解问题的性质
- 维护一个或一组和窗口相关联的状态变量,能有效降低计算量和算法复杂度
实现代码:
方法一:暴力解法
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | var minSubArrayLen = function(target, nums) {let res = Number.MAX_VALUE;
 let [sum,subLen] = [0,0];
 for(let i=0;i<nums.length;i++){
 sum = 0;
 for(let j=i;j<nums.length;j++){
 sum += nums[j];
 
 if(sum>=target){
 subLen = j-i+1;
 res = res<subLen?res:subLen;
 break;
 }
 }
 
 }
 return res===Number.MAX_VALUE?0:res;
 
 };
 
 | 
方法二:滑动窗口法
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | var minSubArrayLen = function(target, nums) {
 let [sum,subLen,res]=[0,0,Number.MAX_VALUE];
 
 let i=0;
 for(let j=0;j<nums.length;j++){
 sum += nums[j];
 while(sum>=target){
 subLen=j-i+1;
 res = res<subLen?res:subLen;
 sum-=nums[i];
 i++;
 }
 }
 return res!==Number.MAX_VALUE?res:0;
 };
 
 |