力扣42接雨水

1暴力法
遍历数组每个柱子的下标current,然后再往两边扩展找到两边最高的柱子高度,leftmaxheight和rightmaxheight
result+=min(height[leftmaxheight], height[rightmaxheight] )-height[current]
如果两边最高的柱子中,较小的那个比当前柱子矮,说明接不了雨水,result不加

2,带存储的优化暴力法
将左右两边最高的柱子提前存储,
从左往右遍历每个柱子
temp_maxheight=max(temp_maxheight, height[current])
leftmaxheights[current]=temp_maxheight
从右往左遍历每个柱子
temp_maxheight=max(temp_maxheight, height[current])
rightmaxheights[current]=temp_maxheight

3使用栈
将两个高的柱子看作装下雨水的桶型的两边,中间较矮的部分就可以放下雨水,两个柱子的高度作为限定高,两个柱子的距离是水的限定宽度
方法:依次向栈里放入每个柱子的下标号
遇到current的柱子时有几种情况:
1、current柱子比st.top的柱子高
该柱子的左侧有可能装下雨水,current可以作为桶的右侧,还要找到桶的左侧才能确定雨水的容量。需要寻找栈顶下面的柱子高度,stack[top-1]此时也有几种情况
(1)top-1比top高
top-1就可以和current组成一个桶,雨水量高度为top-1,current中较小的那个,宽度为current- (top-1)-1.。(top-1仅表示栈顶下一个柱子的高度)并将top出栈,current入栈
(2)top-1和top一样高
这时算出来result加0
(3)top-1比top低
这一定刚看的时候很难理解,如果按照公式计算,result会加上一个负数,实际上不会出现这种情况,top的柱子在作为current的时候已经处理了top-1,并将top-1的柱子出栈
2、current和st.top一样
显然current柱子矮了,它的左边不能积累雨水,将current放入栈,找下一个柱子
3、current比st.top低
显然current柱子矮了,不能作为装雨水的两边,将current放入栈,找下一个柱子
该方法是横向的计算所以雨水量,而不是每个柱子上竖向的雨水量

4双指针法
left =0 right=size-1
leftmax=rightmax=0
1、如果left柱子比right柱子小,
计算left柱子高度与leftmax的差值就是雨水的量,更新leftmax,left++
2、left比right大,
计算right柱子高度与leftmax的差值就是雨水的量,更新rightmax,right++

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值