关于for循环(leetcode 209长度最小的子数组)

文章讨论了一个寻找目标和的最小子数组长度的Java代码实现。代码中存在两个错误:右指针rx的更新时机不当和条件判断合并问题。修复方案是调整rx和lx的更新顺序以及分开判断子条件。修复后的代码提高了效率,但仍可能比最优的滑动窗口方法多一些步骤。
摘要由CSDN通过智能技术生成
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;
      
    }
}

但对比最佳的滑动窗口法

似乎还是多了一些多余的寻找子数组的步骤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值