滑动窗口大多用于处理连续子数组问题,然后得到相应的长度。
例题:长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
思路:使用滑动窗口i
在左边,j
在右边,明确意义[i,j]
为滑动窗口(闭区间)。如果滑动窗口内的和小于s,则j++
来扩大窗口范围。否则说明达到题目要求,记录此时的长度,然后i++
,使窗口缩小。重复以上步骤直到i到达数组末尾,注意不要让j越界。
时间复杂度:O(n)
class Solution {
public int minSubArrayLen(int s, int[] nums) {
int tmp = 0;
for(int n:nums){
tmp+=n;
}
if(tmp<s) return 0; //假如不存在,返回0
int i = 0;
int j = 0;
int sum = nums[0];
int res = Integer.MAX_VALUE;
while(i<nums.length){
if(sum<s){
//和不够大
if(j<nums.length-1){
//当j未越界,移动j
sum+=nums[++j];
}else{
//如果越界了,移动i
sum-=nums[i++];
}
}else{
res = Math.min(res,j-i+1);
sum-=nums[i++