2023-07-23 LeetCode每日一题(接雨水)

2023-07-23每日一题

一、题目编号

42. 接雨水

二、题目链接

点击跳转到题目位置

三、题目描述

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

提示:

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

示例1:
2023-07-23 LeetCode每日一题(接雨水)_第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。

你可能感兴趣的:(LeetCode每日一题,leetcode,算法,数据结构)