算法day4 长度最小的子数组|滑动窗口
题目描述

思路:双指针
对于这样的一个正整数数组,我们可以设置两个指针i,j来控制滑动窗口的长度(即本题中子数组的长度),设置一个sum来计算当前窗口内的元素的和,window_length来记录当前的最小窗口的长度。我们以i作为窗口的起始,j指针在循环中生长。通过循环计算sum的值与target进行比较,若大于等于,则要收缩窗口,收缩的方式是对窗口起始指针i进行自增。计算对应的窗口长度与原本的窗口长度进行比较更新,并将被窗口抛出的部分的元素的值从sum中减去。最后返回window_length。
代码如下
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0;
int window_length = INT_MAX; //window_length的初始化不能用nums.size(),会有部分样例不通过,INT_MAX表示最大整型
int len = nums.size();
int i = 0;
int subl;
for(int j =0;j<len;j++){
sum += nums[j];
while(sum >= target){//这里收缩要用while
subl = j-i+1;
window_length = min(window_length,subl);
sum =sum - nums[i];
i++;
}
}
return window_length = window_length == INT_MAX ? 0 : window_length;
}
时间复杂度:O(n)
空间复杂度:O(1)
END
浙公网安备 33010602011771号