经典的滑动窗口问题,我认为滑动窗口就是维护一个满足条件的区间,例如这一题就是要求我们维护一个子数组,要求这个子数组里面的值相加要大于等于target的值并且这个子数组要尽可能的短,然后返回其最小区间的长度。所以我们需要在维护区间的同时,并对区间进行监测,在每次满足条件时去比较当前区间是不是长度最小的区间。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
//区间左边界
int left=0;
//区间里当前值的合
int curSum=0;
//区间最小的长度
int minLength=Integer.MAX_VALUE;
//进行遍历 这里的i就是右边界
for(int i=0;i<nums.length;i++){
//开始向右扩张区间
curSum+=nums[i];
//如果维护的区间满足条件 就进行判断
if(curSum>=target){
//如果值大于target就一直缩小窗口,因为题目要求要最短的区间 left++
while(curSum-nums[left]>=target){
curSum-=nums[left];
left++;
}
//更新窗口的最短长度
minLength= Math.min(minLength,i-left+1);
}
}
//防止出现整个数组的值相加都没有target值大
if(curSum<target){
minLength= 0;
}
return minLength;
}
}
感觉滑动窗口的问题都是要确定左右边界,然后根据条件进行区间的扩大和缩小 ^ ^