举例解释 滑动窗口算法实现 中的双while循环
target = 5 nums = [1,2,3,4,5]
n = 5
循环开始时,s,e均为0
s,e
1 2 3 4 5
每次将下标e的元素放入sum
sum += nums[0] = 1
1 < 5
e++
s e
1 2 3 4 5
sum += nums[1] = 1+2=3
3 < 5
e++
s e
1 2 3 4 5
sum += nums[2] = 3+3 = 6
6 >=5
进入第二层while循环
计算 满足条件的子数组最小长度
取ans 和 [s,e]之间的最小值
ans = Math(ans,e-s+1)
重点 此为滑动数组的关键 判断该满足条件的子数组 是否存在 满足条件且数组长度更小的情况
sum 减去nums[s] 的值
sum -= nums[0] = 6-1=5
将s 前移一位
s e
1 2 3 4 5
循环条件 sum >= target
5 >= 5
找到了满足条件且数组长度更小的情况
ans = Math.min(ans,s-e+1) = Math.min(3,2-1+1) = 2
继续执行循环
sum-=nums[s] = 5 - 2 =3
s 前移一位
s,e
1 2 3 4 5
3<5 不满足循环条件 结束内层循环
e前移一位
s e
1 2 3 4 5
sum += nums[3] = 3+4=7
7 >=5 进入内层循环
ans = Math.min(2,2) = 2
sum 减去nums[s]的值
sum -= nums[2] = 4
s前移一位
s,e
1 2 3 4 5
判断循环条件 4 < 5 结束内层循环
e前移一位
s e
1 2 3 4 5
sujm += nums[4] = 4+5 =9
9 >=5 进入内层循环
ans = Math.min(2,2) = 2
sum 减去nums[s]的值
sum -= nums[3] = 5
s前移一位
s,e
1 2 3 4 5
判断循环条件 5>=5 继续执行循环
找到了满足条件且数组长度更小的情况
ans = Math.min(2,4-4+1) = 1
sum -= nums[4] = 0
s前移一位
e s
1 2 3 4 5
判断循环条件 0 < 5 结束内层循环
e前移一位
s,e
1 2 3 4 5
e = 5 e >= n 不满足外层循环条件 结束循环
结果ans = 1
classSolution{publicintminSubArrayLen(int target,int[] nums){int start =0, end =0;int ans =Integer.MAX_VALUE;int n = nums.length;int sum =0;while(end < n){
sum += nums[end];while(sum >= target){
ans =Math.min(ans, end - start +1);
sum -= nums[start];
start++;}
end++;}return ans ==Integer.MAX_VALUE ?0: ans;}}