LeetCode-42. 接雨水

LeetCode-42. 接雨水

问题分析

从左往右遍历数组height,对于每个元素执行如下的单调栈操作:

若栈不为空,且栈顶元素的高度值小于当前元素的高度值,说明栈顶元素可以接雨水

  • 弹出栈顶元素,记为floor,表示当前接雨水区域底部的高度
  • 若此时栈为空,说明左边没有墙体,无法接雨水,跳出循环。
  • 否则,再取一个栈顶元素left,获取左墙的高度和下标
  • 根据已知信息,便可以获取以floor为底,以left作为左墙体,以当前元素为右墙体,构成区域所能截取的雨水量

上述流程执行完成后,此时栈顶元素的高度大于等于当前元素的高度,当前元素是潜在的左墙体,因此压入单调栈中。

程序代码

C++

cpp 复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        // 存储下标
        stack<int> stk;
        int res = 0;
        for(int i = 0; i < height.size(); i++) {
            while( !stk.empty() && height[stk.top()] < height[i] ) {
                int floor = stk.top();
                stk.pop();
                // 边界情况:没有左墙
                if( stk.empty() )  break;
                // 获取左墙高度
                int left = stk.top();
                int curHeight = min(height[left],  height[i]) - height[floor];
                res += curHeight * (i - left - 1);
            }
            stk.push(i);
        }
        return res;
    }
};

Go

go 复制代码
func trap(height []int) int {
    stack := []int{}
    res := 0

    for i, h := range height {
        for len(stack) > 0 && height[stack[len(stack)-1]] < h {
            floor := stack[len(stack) - 1]
            stack = stack[:len(stack) - 1]
            if len(stack) == 0 {
                break;
            }
            left := stack[len(stack) - 1]
            curHeight := min(height[left], h) - height[floor]
            res += curHeight * (i - left - 1)
        }
        stack = append(stack, i)
    }
    return res
}

func min(a, b int) int {
    if a <= b {
        return a
    }
    return b
}
相关推荐
小白羊丨28 分钟前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
OPEN-F2 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法
lisin-lee-cooper2 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法
sunburn-2 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法
智碳能碳管理平台3 小时前
工业能耗台账标准化:能碳管理系统的数据口径怎么设计
算法·能碳管理系统·智碳能碳管理平台·企业能碳管理系统·碳排放核算软件·绿色工厂申报saas·能碳管理平台
带多刺的玫瑰3 小时前
Leecode#15刷题之三数之和
算法·leetcode·职场和发展
圣保罗的大教堂3 小时前
leetcode 877. 石子游戏 中等
leetcode
哭泣方源炼蛊3 小时前
并查集进阶 P1(带权并查集,并查集分类)
数据结构·c++·算法·二进制·带权并查集
牧羊人.3334 小时前
动手学深度学习 02 | 手写数字识别
图像处理·人工智能·深度学习·算法
武帝为此4 小时前
【InnoDB存储引擎介绍】
数据库·算法