⭐【LeetCode】- 接雨水 - 单调递减栈,简洁代码,动图模拟(转,二次编辑)

本文介绍了如何利用单调递减栈算法解决LeetCode上的‘接雨水’问题。通过分析柱子高度图,利用栈来跟踪可接雨水的区间,最终计算累积的最大雨水体积。关键步骤包括入栈低高度柱子、遇到高柱子时结算雨水和更新答案。
摘要由CSDN通过智能技术生成

原作链接:

转自: 【接雨水】单调递减栈,简洁代码,动图模拟.


题目描述:

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

测试样例:

示例 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
  • 0 <= n <= 3 * 104
  • 0 <= height[i] <= 105

思路:

  1. 使用单调栈, 【单调栈入门】.
  2. 单调递减栈
    2.1. 理解题目,参考图解,注意题目的性质,当后面的柱子高度比前面的低时,是无法接雨水的
    2.2. 当找到一根比前面高的柱子,就可以计算接到的雨水
    2.3. 所以使用单调递减栈
  3. 对更低的柱子入栈
    3.1. 更低的柱子以为这后面如果能找到高柱子,这里就能接到雨水,所以入栈把它保存起来
    3.2. 平地相当于高度 0 的柱子,没有什么特别影响
  4. 当出现高于栈顶的柱子时
    4.1. 说明可以对前面的柱子结算了
    4.2. 计算已经到手的雨水,然后出栈前面更低的柱子
  5. 计算雨水的时候需要注意的是
    5.1. 雨水区域的右边 r 指的自然是当前索引 i
    5.2. 底部是栈顶 st.top() ,因为遇到了更高的右边,所以它即将出栈,使用 cur 来记录它,并让它出栈
    5.3. 左边 l 就是新的栈顶 st.top()
    5.4. 雨水的区域全部确定了,水坑的高度就是左右两边更低的一边减去底部,宽度是在左右中间
    5.5 使用乘法即可计算面积

动图解

动图解


题解:

单调递减栈

@Override
class Solution {
public:
    int trap(vector<int>& height)
	{
	    int ans = 0;
	    stack<int> st;
	    for (int i = 0; i < height.size(); i++)
	    {
	        while (!st.empty() && height[st.top()] < height[i])
	        {
	            int cur = st.top();
	            st.pop();
	            if (st.empty()) break;
	            int l = st.top();
	            int r = i;
	            int h = min(height[r], height[l]) - height[cur];
	            ans += (r - l - 1) * h;
	        }
        	st.push(i);
    	}
    	return ans;
    }
};

/*
作者:ikaruga
链接:https://leetcode-cn.com/problems/trapping-rain-water/solution/trapping-rain-water-by-ikaruga/
来源:力扣(LeetCode)
*/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值