/** * @Description 典型的滑动窗口问题 * nums[left .... right] 为我们的滑动窗口 * 如果当前sum < target 则窗口右面的边界右移,扩大窗口大小,sum = sum + nums[right] * 如果当前sum >= target 则窗口左边界右移,缩小窗口大小,sum = sum - nums[left],记录数组大小 * * @Date 2022/1/9 7:31 下午 * @Author wuqichuan@zuoyebang.com **/class Solution { public int minSubArrayLen(int target, int[] nums) { int left = 0; //right = -1是为了确保刚初始化的时候,窗口里是没有有效数据了 int right = -1; int sum = 0; int minLength = nums.length + 1; while (left < nums.length){ //先确定好当前的sum值是什么 //如果sum < target 则说明值不够大,右边界需要右移,sum 需要增大 //所以 right 先++ 然后累加sum if(right+1 < nums.length && sum < target){ right++; sum = sum + nums[right]; }else { //如果sum 已经 >= target了,则说明值大了,左边界需要右移 sum = sum - nums[left]; left++; } if(sum >= target){ //记录当前数组长度,和当前最小长度取一个最小值出来 minLength = Math.min(minLength, right - left + 1); } } if(minLength == nums.length + 1){ return 0; }else{ return minLength; } }}