给定 n 个非负整数表示每个宽度为 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
解法一:栈










代码:
public class Solution {public int trap(int[] height) {int sum = 0;Stack<Integer> stack = new Stack<>();int current = 0;while (current < height.length) {//如果栈不空并且当前指向的高度大于栈顶高度就一直循环while (!stack.empty() && height[current] > height[stack.peek()]) {int h = height[stack.peek()]; //取出要出栈的元素stack.pop(); //出栈if (stack.empty()) { // 栈空就出去break;}int distance = current - stack.peek() - 1; //两堵墙之前的距离。int min = Math.min(height[stack.peek()], height[current]);sum = sum + distance * (min - h);}stack.push(current); //当前指向的墙入栈current++; //指针后移}return sum;}}
解法二:暴力
public class Solution {public int trap(int[] height){int a = 0;int b = height.length-1;int max = 0;int leftmax = 0;int rightmax = 0;while (a <= b) {leftmax = Math.max(leftmax,height[a]);rightmax = Math.max(rightmax,height[b]);if (leftmax < rightmax) {max += (leftmax-height[a]);a++;} else {max += (rightmax-height[b]);b--;}}return max;}}

