leetcode42--计算一排柱子盛水量
解析
本体主要是思路,思路理顺了,代码很简单,思路如下:
对于每个柱子,找到其左右两边最高的柱子,该柱子能容纳的面积就是min(max_left,max_right) - height。其中height是每个柱子的高度
所以,
- 从左往右扫描一遍,对于每个柱子,求取左边最大值;
- 从右往左扫描一遍,对于每个柱子,求最大右值;
- 再扫描一遍,把每个柱子的面积并累加。
package no1_50;
public class subject042 {
class Solution {
public int trap(int[] height) {
int result = 0 ;
int len = height.length;
int[] maxLeft = new int[len];
int[] maxRight= new int[len];
//求出每个柱子左边的最高柱、右边最高柱子,第一个的左边最高柱子为0,最后一个右边最高柱子为0
for(int i=1; i<len; i++) {
maxLeft[i] = Math.max(maxLeft[i-1], height[i-1]);
maxRight[len-1-i]= Math.max(maxRight[len-i], height[len-i]);
}
for(int i=0; i<len; i++) {
//遍历每个柱子,如果该柱子的左右最大柱子都比它高,则所载水的量有最低的那个决定
int importantHeight = Math.min(maxLeft[i], maxRight[i]);
if(importantHeight>height[i]) {
result += importantHeight-height[i];
}
}
return result;
}
}
public static void main(String[] args) {
subject042 subject = new subject042();
Solution s = subject.new Solution();
int[] nums = {0,1,0,2,1,0,1,3,2,1,2,1};
int result = s.trap(nums);
System.out.println(result);
}
}