zoukankan      html  css  js  c++  java
  • 【LeetCode】接雨水

    【问题】

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

    上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。感谢 Marcos 贡献此图。

    示例:

    输入: [0,1,0,2,1,0,1,3,2,1,2,1]
    输出: 6

    【思路】首先我们定义left[i]表示i左边的最大值,right[i]表示i右边的最大值,并且两个数组初始化均为零。接着我们遍历整个数组,对于每一个位置i都获取其左右两边的最大值,并比较获取最小的数为level,也就是说没有柱子的话,雨水的高度为level.
    从而实际对于i来说收集的雨水为level-height[i] !!!

    class Solution {
    public:
        int trap(vector<int>& height) {
            int n = height.size();
            // left[i]表示i左边的最大值,right[i]表示i右边的最大值
            vector<int> left(n), right(n);
            for (int i = 1; i < n; i++) {
                left[i] = max(left[i - 1], height[i - 1]);
            }
            for (int i = n - 2; i >= 0; i--) {
                right[i] = max(right[i + 1], height[i + 1]);
            }
            int water = 0;
            for (int i = 0; i < n; i++) {
                int level = min(left[i], right[i]);
                water += max(0, level - height[i]);
            }
            return water;
        }
    };
  • 相关阅读:
    mysql 配置
    idea 学会看log文件
    ac自动机(tree+kmp模板)
    矩阵快速幂(纯数学递推)
    矩阵快速幂(queue递推)
    RMQ(连续相同最大值)
    dp(过河问题)
    bfs(火星撞地球)
    相同子序列集合
    图博弈
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11720957.html
Copyright © 2011-2022 走看看