面试题 17.21. 直方图的水量 - Go语言中文社区

面试题 17.21. 直方图的水量


给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/volume-of-histogram-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解: 可以看出每个蓄水处的水量等于从此位置
m i n ( 向 左 的 最 高 的 高 度 , 向 右 最 高 的 高 度 ) − 自 身 的 高 度 min(向左的最高的高度,向右最高的高度)-自身的高度 min(,)
先算出每个点向左的最高高度,每个点向右的最高高度
然后根据式子计算累加

class Solution {
public:
    
    int trap(vector<int>& height) { 
        if(height.empty()) return 0;
        int n = height.size();
        int ans = 0;
        vector<int> left(n),right(n);
        left[0] = height[0], right[n-1] = height[n-1];
        for(int i=1; i<n; ++i){
            left[i] = max(left[i-1],height[i]);
        }
        for(int i=n-2; i>=0; --i){
            right[i] = max(right[i+1],height[i]);
        }
        for(int i=0; i<n; ++i){
            ans += min(left[i],right[i]) - height[i];
        }
        return ans;
    }
};
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_26139541/article/details/115440677
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-13 18:52:42
  • 阅读 ( 634 )
  • 分类:面试题

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢