【LeetCode每日一题】直方图的水量
直方图的水量
1、题目描述
给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)
输入示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
2、解题思想
思考:
1、只要左右两边墙比我本身高,那么我就可以注水成功,但是同时考虑边情况比较复杂
1、因此我们先思考先满足一边注水成功的情况,只要一边上的位置比我当前高,那么我就可以注水
2、因此我们可以得到从左往右注水,和从左往右注水的情况,只要取他们的交集就行了
解题方式:
1、先从左往开始遍历,只要右边的位置比左边最高的低,我们就给它注水,如下图第一个图所示
2、再从右往左遍历,只要左边的位置比右边低,我们还是给它注水,如下图第二个图所示
3、从两个遍历的数组中,选取每个位置最小值进行相加即可得到我们的最终结果。
下图就是取交集后的结果
3、代码实现
package com.java;
import java.util.Stack;
public class Day02_Solution {
public int trap(int[] height) {
int[] leftMax = new int[height.length];
int[] rightMax = new int[height.length];
int sum=0;
int max=0;
for(int i=0;i<height.length;i++) {
if (max < height[i]) {
max = height[i];
}
leftMax[i] = max - height[i];
}
max = 0;
for (int i=height.length-1;i>=0;i--) {
if (max < height[i]) {
max = height[i];
}
rightMax[i] = max - height[i];
}
for (int i=0;i<height.length;i++) {
sum = sum + (rightMax[i] < leftMax[i] ? rightMax[i]:leftMax[i]);
}
return sum;
}
}