直方图的水量,(三指针)
Posted ascto
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了直方图的水量,(三指针)相关的知识,希望对你有一定的参考价值。
给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。
class Solution
public int trap(int[] height)
int len = height.length;
int left = 0, right = 1; // 左右区间指针
int recordIndex = -1; // 记录当前遍历的区间里递增段中终最大元素位置
int result = 0;
while (right < len)
if (height[right - 1] < height[right]) // 开始递增了
if (height[right] >= height[left]) // 如果当前的元素大于左边界的,直接计算水量
result += calcSave(height, left, right);
// 更新位置
left = right;
recordIndex = -1;
else if (recordIndex == -1 || height[right] >= height[recordIndex])
recordIndex = right; // 记录递增的值
if (right == len - 1 && recordIndex != -1)
right = recordIndex;
result += calcSave(height, left, right);
// 更新位置
left = right;
recordIndex = -1;
right++;
return result;
public int calcSave(int[] height, int left, int right)
// 当前左右区间中值小的那个
int curMinHeight = Math.min(height[left], height[right]);
// 计算当前区间,应该减掉的实体
int curHeightSum = 0;
if (curMinHeight != 0)
for (int i = left + 1; i < right; i++)
if (height[i] >= curMinHeight)
curHeightSum += curMinHeight;
else
curHeightSum += height[i];
return ((right - left - 1) * curMinHeight - curHeightSum);
以上是关于直方图的水量,(三指针)的主要内容,如果未能解决你的问题,请参考以下文章
算法之双指针(共同点:核心逻辑思路:即先找到比较小的区域(例如决定了存水量),然后在比较小的区域中找到一个最大值))~盛最多水的容器~~~接雨水