class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int sum = 0;
int length = Integer.MAX_VALUE ;
for(int right = 0; right < nums.length ; right++){
sum+=nums[right];
while(sum >= target){
length = Math.min(length,right - left + 1);
sum -= nums[left];
left += 1;
}
}return length == Integer.MAX_VALUE ? 0:length;
}
}
滑动窗口,重点在如何保持移动
- 未符合要求,右边界移动,直到满足要求;
- 符合要求,左边界移动,再查看是否满足要求,未满足,重复2;满足,重复1.
- 直至完成遍历
还有一个关键在于,如何获得最小的窗口长度,每次满足要求,窗口长度都会变化,如何能不断更新以获得其最小值。
因为只需要一个最小值,所以每次只保留一个值即可,这里选择用一个足够大的值与窗口值,即Integer.MAX_VALUE,第一次满足要求后,将获取到的窗口长度与其相比,取小。一定能够将length更新为此时的窗口长度,即length为第一次窗口长度。第二次比较时,length代表第一次窗口长度,right-left+1,为第二次满足要求的长度,以此类推