You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

while循环条件写++lIndex与循环体内自增lIndex的差异及超时原因

接雨水算法两种循环写法超时原因分析

两种写法逻辑并不等价,第二种写法会触发死循环,这是超时的根本原因,具体差异如下:

写法1执行逻辑

代码:

while (lIndex < rIndex && height[++lIndex] <= left) {
    ans += (left - height[lIndex]);
}
  • 由于&&是短路运算符,只有lIndex < rIndex条件成立时,才会执行后续的++lIndex操作
  • 只要进入右半段判断,lIndex一定会先自增1,再判断对应位置的高度是否满足条件
  • 即使height[++lIndex] <= left不满足、退出内层循环时,lIndex也已经完成了自增,外层循环的索引会持续向rIndex靠近,不会出现停滞

写法2执行逻辑

代码:

while (lIndex < rIndex && height[lIndex + 1] <= left) {
    ans += (left - height[lIndex + 1]);
    lIndex++;
}
  • 仅判断lIndex+1位置的高度是否满足条件,判断阶段不会修改lIndex本身的值
  • 当height[lIndex + 1] > left时,内层循环直接退出,lIndex完全没有发生变化
  • 回到外层while (lIndex < rIndex)循环时,lIndex和rIndex的相对位置没有变化,left = height[lIndex]的值也和上一轮完全一致,会再次进入同一个内层分支、再次直接退出,形成无限死循环,最终导致超时

复现示例

举个简单的场景:当前lIndex=2,height[2]=3(即left=3),height[3]=5,rIndex=5且height[rIndex]=4:

  • 写法1:判断2<5成立,lIndex自增为3,height[3]=5>3,内层循环退出,lIndex更新为3,外层循环正常推进
  • 写法2:判断2<5成立,height[3]=5>3,内层循环直接退出,lIndex仍然为2,下一轮外层循环会重复执行完全相同的逻辑,永远无法跳出

内容的提问来源于stack exchange,提问作者user15064722

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:18:00