给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
解决这道题的核心不在于双指针,而在于体积相减的思路!观察发现,储水体积等于最后体积减去储水前的体积,储水前的体积直接调用accumulate实现,储水后的体积通过双指针逐层遍历的方式实现,每层都是连续的块组成,而且下面层一定比上面层长,那么只要规定一个高度,从1开始,一层一层往上直到左右指针相遇,注释已经很详尽了,代码如下:
class Solution {
public:
int trap(vector<int>& height) {
// 当前体积大小
int volume = accumulate(height.begin(), height.end(), 0);
int left = 0, right = height.size() - 1;
int high = 1;
// 定义总体积
int totalVolume = 0;
while(left <= right) {
// 左边不够高
while(left <= right && height[left] < high) {
left ++;
}
// 右边不够高
while(left <= right && height[right] < high) {
right --;
}
// 逐层加长度
totalVolume += right - left + 1;
high ++;
}
return totalVolume - volume;
}
};
/*作者:heroding
链接:https://leetcode-cn.com/problems/volume-of-histogram-lcci/solution/cshuang-zhi-zhen-zhu-ceng-bian-li-by-her-50u7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/