class Solution {
public int minSubArrayLen(int target, int[] nums) {
int lx = 0;
int sum = 0;
int length = nums.length;
int rx = 0;
int max = 0;
for(int i=0;i<nums.length;i++)
{
max=max+nums[i];
}
if(max<target){return 0;}
if(max==target){return nums.length;}
for(;rx<nums.length;rx++)
{
sum += nums[rx];
if(sum>=target&&rx-lx+1<length){
// rx-lx+1<=length
length=rx-lx+1;
lx++;
rx=lx; //企图重新赋值rx(右指针)来修改for循环,将开始一个新的for进程
sum=0;
}
}
return length;
}
}
上述是错误代码,错误不在于for循环中的rx(也就是通常的i不能修改),而在于
1、rx=lx应该在前,lx++应该在后,因为for循环已经有rx++,如果rx=lx在lx++后,会导致rx+2,会使右指针没能指向左指针lx
改成
rx=lx;
lx++;
就可以右指针能重新指向左指针,重新开始一轮for循环
2、if(sum>=target&&rx-lx+1<length)应该要分开判断,先判断sum>=target,再判断rx-lx+1<length
不然会导致当rx-lx+1>=length且sum>=target不能重新开始for循环,那么该轮for循环结束,就不能遍历整个数组
正确答案是
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int lx = 0;
int sum = 0;
int length = nums.length;
int rx = 0;
int max = 0;
for(int i=0;i<nums.length;i++)
{
max=max+nums[i];
}
if(max<target){return 0;}
if(max==target){return nums.length;}
for(;rx<nums.length;rx++)
{
sum += nums[rx];
if(sum>=target){
if(rx-lx+1<length){
length=rx-lx+1;
}
rx=lx;
lx++;
sum=0;
}
}
return length;
}
}
但对比最佳的滑动窗口法
似乎还是多了一些多余的寻找子数组的步骤