题目
思路
首先就想到滑动窗口,这题用常规的滑动窗口能做,但是效率不高。
图片思路来自代码随想录(https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html#%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3)
采用动态的滑动窗口,即滑动窗口找到窗口内的内容符合条件时,窗口从左侧开始缩小,每缩小一次判断一次是否还符合条件,若符合则更新结果并继续缩小,若不符合则从右侧扩大窗口。
这个逻辑下算法时间复杂度为O(n)。
代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int res = INT32_MAX;
int i = 0; // 窗口起点
int sum = 0;
for(int j=0;j<nums.size();j++){
sum+=nums[j];
while(sum>=target){
if(res>(j-i+1)){
res = j-i+1;
}
sum-=nums[i++]; //代码精髓:动态调节窗口大小
}
}
return res==INT32_MAX?0:res;
}
};