力扣:接雨水

力扣

给定 n 个非负整数表示每个宽度为 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 个单位的雨水(蓝色部分表示雨水)。 
示例 2:

输入:height = [4,2,0,3,2,5]
输出:9
 

提示:

n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

能想到这么做,但是要跟大家讲出来。可能会有点困难。我不知如何描述。

假设每个元素都是单调递增的话。下雨的时候就会流走。但是单调递减的话,遇到前一个比后一个高那么就撞墙了。这时就可以计算能盛水容量。因为单调性被破坏。那么前一个大于后一个满足单调性继续往后走。

直接上代码

package main

import "fmt"

func main(){
    ans := 0 
    heights := []int{0 , 1, 0 ,2, 1, 0 , 1, 3, 2 ,1, 2, 1}    
    type Rect struct{
        Width int
        Height int
    }
    for key := range heights{
        height := heights[key]
        wc := 0
        //栈顶元素与当前元素,条件不满足,单调性破坏
        for len(stack) > 0 && stack[len(stack) - 1].Height <= height{
            //弹栈
            top := stack[len(stack) -1]
            stack = stack[len(stack) - 1]
            bottom := top.Height
            wc += top.Width
            if len(stack) <= 0 {
                continue
            }
            up := height
            if stack[len(stack) - 1].Height < height{
               up  = stack[len(stack) - 1].Height
            }
            //更新答案
            ans += wc * (up - bottom)
        }
        //入栈
        stack = append(stack, Rect{
            Width: wc + 1,
            Height : height,
        })
    }
    
    fmt.Println(ans)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值