LeetCode中国站接雨水算法问题求助:代码逻辑错误排查
排查接雨水算法的逻辑错误
首先看你的代码,能看出来你试图通过寻找左侧的最高柱子来计算雨水,但嵌套循环的逻辑太混乱,加上忽略了接雨水的核心规则,导致出现了不少问题。咱们一步步拆解:
你的代码里的核心问题
指针越界与遍历混乱:你在代码里直接用
pos + 1,但完全没做边界检查——当pos指向数组最后一个元素时,pos + 1就超出了vector的范围,会触发未定义行为。而且多层for循环里多次对pos执行++操作,外层循环的遍历节奏被内层打乱,很多柱子的位置会被跳过,根本没被处理。错误的雨水计算逻辑:接雨水的核心规则是每个位置能接住的水量 = min(左侧最大高度, 右侧最大高度) - 当前柱子高度,但你的代码只考虑了左侧的最大高度,完全没管右侧有没有足够高的柱子来"兜住"雨水。比如如果左侧有个高柱子,但右侧全是矮柱子,那这个位置根本接不住水,你的代码却会强行用左侧最大值减去当前高度,导致计算出错误的水量。
嵌套循环与break滥用:多层嵌套的for循环里到处都是
break,导致代码的执行流程非常不可控。比如很多时候内层循环刚执行就被break跳出,根本没有完成寻找右侧边界柱子的逻辑,自然无法正确计算区间内的雨水量。
修复后的高效解法(双指针法)
这里给你一个时间复杂度O(n)、空间复杂度O(1)的双指针实现,逻辑清晰且高效:
int trap(vector<int>& height) { if (height.empty()) return 0; int left = 0, right = height.size() - 1; int left_max = 0, right_max = 0; int total = 0; while (left < right) { // 移动较矮的一侧指针,因为当前位置的接水量由较矮侧的最大高度决定 if (height[left] < height[right]) { if (height[left] >= left_max) { // 更新左侧最大高度 left_max = height[left]; } else { // 计算当前位置能接的水量 total += left_max - height[left]; } left++; } else { if (height[right] >= right_max) { // 更新右侧最大高度 right_max = height[right]; } else { // 计算当前位置能接的水量 total += right_max - height[right]; } right--; } } return total; }
逻辑说明
双指针从数组两端向中间移动:
- 始终维护
left_max(左侧遍历过的最大高度)和right_max(右侧遍历过的最大高度)。 - 每次移动较矮的一侧指针——因为如果左侧柱子更矮,那么当前左侧位置的接水量完全由
left_max决定(右侧有更高的柱子兜底);反之同理。 - 如果当前柱子高度大于等于同侧的最大高度,就更新最大高度;否则计算当前位置能接的水量并累加到总和里。
这样就能准确计算出所有位置能接的雨水总量啦。
内容的提问来源于stack exchange,提问作者jonas
相关产品推荐
相关产品推荐

