前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >接雨水-单调栈解法

接雨水-单调栈解法

原创
作者头像
_春华秋实
修改2023-08-30 20:16:34
1650
修改2023-08-30 20:16:34
举报
文章被收录于专栏:_春华秋实_春华秋实

题目链接

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

示例 1:

代码语言:javascript
复制
输入: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 个单位的雨水(蓝色部分表示雨水)。 

解题思路

单调栈:栈内元素单调按照递增(递减)顺序排列的栈

链接

代码语言:javascript
复制
func trap(height []int) (ans int) {
    stack := []int{} //使用切片模拟单调栈
    for i, h := range height {
        //循环遍历单调栈中的下标,求每个下标对应的面积
        for len(stack) > 0 && h > height[stack[len(stack)-1]] {
            //栈顶元素下标
            top := stack[len(stack)-1]
            stack = stack[:len(stack)-1]
            if len(stack) == 0 {
                break
            }
            //栈顶的下一个元素下标
            left := stack[len(stack)-1]
            //求到这个下标的低洼处的宽度和高度
            curWidth := i - left - 1 
            curHeight := min(height[left], h) - height[top]
            ans += curWidth * curHeight
            // fmt.Printf("%d -- %d -- %d -- %d \n", left, curWidth, curHeight, ans)
        }
        stack = append(stack, i)
    }
    return
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解题思路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档