42.接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

思路:
我想的是用双向指针left, right, 将两边最高高度都初始化为0,leftMax = 0, rightMax = 0,循环遍历,将leftMax与height[left]相比较,right也同理,取最大值更新,用Max去减去比其小的部分就得到各区域雨水高度,我们会将值存在sum中,所以不用担心后续Max值变化的时候会影响到结果。

代码:

class Solution {
public:
    int trap(vector<int>& height) {
        int sum = 0;
        int left = 0, right = height.size() - 1;
        int leftMax = 0, rightMax = 0;
        while(left<right){
            leftMax = max(leftMax,height[left]);
            rightMax = max(rightMax,height[right]);
            if(height[left]<height[right]){
                sum += leftMax - height[left];
                left++;
            }else {
                sum += rightMax - height[right];
                right--;
            }
        }
        return sum;
    }
};

时间复杂度:O(n)
空间复杂度:O(1)

posted @ 2026-03-09 21:45  Cloud00  阅读(1)  评论(0)    收藏  举报