题目:
给定 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
分析:
难点在于每个点的盛水需要确定左右的最高点,于是先找到所有柱子中最高的一根,再对左右进行分治,这样只需要考虑一边已知的最高点即可
代码:
public int trap(int[] height) {
int l = height.length;
// 找出最高点坐标
int maxHeightIndex = 0;
for (int i = 0; i < l; i++) {
if (height[i] > height[maxHeightIndex])
maxHeightIndex = i;
}
int res = 0;
// 分析左半区域
int leftHeightMax = 0;
for (int i = 0; i < maxHeightIndex; i++) {
leftHeightMax = Math.max(leftHeightMax, height[i]);
res += leftHeightMax - height[i] > 0 ? leftHeightMax - height[i] : 0;
}
// 分析右半区域
int rightHeightMax = 0;
for (int i = l - 1; i > maxHeightIndex; i--) {
rightHeightMax = Math.max(rightHeightMax, height[i]);
res += rightHeightMax - height[i] > 0 ? rightHeightMax - height[i] : 0;
}
return res;
}
效率:
总结:
在面对复杂的问题时可以使用先确定一个条件,再分治的方法解决