然后让sum 减去当前的 nums[left],然后将left++,再次进入while循环。这一步的含义是:不断变更序列的开始位置,即寻找满足sum >= s 时的 right - left + 1 的最小值能为多少
最后返回ans
二刷:注意for循环时,定义right= 0,而不是i = 0
注意:在选择ans的时候,是要求 Math.min(…) 而不是max
注意 for 循环内开始的时候 right = 0
方法一
classSolution{// 滑动窗口publicintminSubArrayLen(int s,int[] nums){int left =0;int sum =0;int ans =Integer.MAX_VALUE;for(int right =0; right < nums.length; right++){
sum += nums[right];while(sum >= s){
ans =Math.min(ans, right - left +1);//将sum 减去当前的nums[left]
sum -= nums[left];// 这里体现出滑动窗口的精髓之处,不断变更(子序列的起始位置)
left++;}}return ans ==Integer.MAX_VALUE ?0: ans;}}
方法二 (时间复杂度高)另一种滑动窗口方法
classSolution{publicintminSubArrayLen(int s,int[] nums){//将此题当作不考虑连续子数组的情况int n = nums.length;if(n ==0)return0;int ans =Integer.MAX_VALUE;for(int i =0; i < n; i++){int sum =0;for(int j = i; j < n; j++){
sum += nums[j];if(sum >= s){
ans =Math.min(ans, j - i +1);break;}}}return ans ==Integer.MAX_VALUE ?0: ans;}}