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

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;
}

逻辑说明

双指针从数组两端向中间移动:

  1. 始终维护left_max(左侧遍历过的最大高度)和right_max(右侧遍历过的最大高度)。
  2. 每次移动较矮的一侧指针——因为如果左侧柱子更矮,那么当前左侧位置的接水量完全由left_max决定(右侧有更高的柱子兜底);反之同理。
  3. 如果当前柱子高度大于等于同侧的最大高度,就更新最大高度;否则计算当前位置能接的水量并累加到总和里。

这样就能准确计算出所有位置能接的雨水总量啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:27:52