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
相关产品推荐
相关产品推荐

