2023-07-23每日一题
一、题目编号
42. 接雨水
二、题目链接
点击跳转到题目位置
三、题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
提示:
- n == height.length
- 1 <= n <= 2 * 104
- 0 <= height[i] <= 105
示例1:
示例2:
四、解题代码
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
int height1[n];
int height2[n];
memset(height1, 0, sizeof(height1));
memset(height2, 0, sizeof(height2));
height1[0] = height[0];
height2[n-1] = height[n-1];
for(int i = 1; i < n-1; ++i){
height1[i] = max(height1[i-1], height[i]);
}
for(int i = n-2; i >= 1; --i){
height2[i] = max(height2[i+1], height[i]);
}
int sum = 0;
for(int i = 1; i < n-1; ++i){
sum += (min(height1[i], height2[i])) - height[i];
}
return sum;
}
};
五、解题思路
(1) 首先我们看示例1,我们如何得到每一段的雨水数量呢。我们看第一处有雨水的地方,想要被接住的最大的水的高度,就是左边柱子的最大值和右边柱子的最大值(两者都包含当前柱子的可能性),两者的最小值减去当前位置柱子的高度。这样我们就可以得到每一段接住的雨水的数量。
(2) 我们需要考虑的就是利用动态规划来解决最大值的问题。height1[i]表示i位置即之前所有柱子的最大值。height2[i]表示i位置即以后所有柱子的最大值。
(3) 这是一维DP的内容,如果对一维DP还不够了解的兄弟,可以详细阅读一维DP。