算法训练营第51天|42. 接雨水|84.柱状图中最大的矩形

42. 接雨水

思路(按行计算和按列计算)

双指针思路(按列计算):求左边最高高度和右边最高高度,即可知道当前位置会蓄多少水。

左边最高高度可以由前一个数的左边最高高度求得

右边最高高度可以由后一个数的右边最高高度求得

left[i]=Math.max(left[i-1],height[i-1]);
right[i]=Math.max(right[i+1],height[i+1]);

单调栈思路(按行计算):求左边第一个比自己高的元素和右边第一个比自己高的元素

情况一:当前遍历的元素(柱子)高度小于栈顶元素的高度 height[i] < height[st.top()]

此时构不成凹槽,直接将该元素压入栈内。

情况二:当前遍历的元素(柱子)高度等于栈顶元素的高度 height[i] == height[st.top()]

此时我们想要的是最右边的柱子,所以将栈顶元素弹出,将现在的元素压入栈内。

情况三:当前遍历的元素(柱子)高度大于栈顶元素的高度 height[i] > height[st.top()]

此时已经形成了凹槽,循环计算凹槽大小之后将当前元素压入栈内。

84.柱状图中最大的矩形

单调栈思路:这道题与上道题类似,寻找第一个左边或者右边比其小的数,要注意的是特殊情况,即一直在升或者柱子高度全部相同。如果使用原本的数组,就无法收获结果,于是使用扩展过的数组,即数组两边都加0,这样的话必然收获结果。

暴力解法:循环找第一个最小,自己写的部分超时了,需要改进。

改进部分:不是一个一个寻找最小,而是要借助已经遍历过的部分往过跳。减少了重复次数。

while (j<length&&heights[j]>=heights[i]) j = right[j];

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值