给定 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的解
class Solution {public int trap(int[] height) {int len = height.length;if(len < 3) return 0;int left = 0;int right = 1;int rain = 0;LinkedList<Integer> list = new LinkedList<>();list.addLast(0);while(right < len){if(height[right] >= height[left]){list.clear();list.addLast(right);left = right;}else{rain += height[left] - height[right];//int last = list.getLast();while(height[right] >= height[list.getLast()]) list.removeLast();// last不是连续的list.addLast(right);}right++;}if(list.size() > 1){int first = list.removeFirst();int last = first;for(int sec : list){rain -= (height[first] - height[sec]) * (sec - last);last = sec;}}return rain;}}
栈
public int trap(int[] height) {int ans = 0, current = 0;Deque<Integer> stack = new LinkedList<Integer>();while (current < height.length) {while (!stack.isEmpty() && height[current] > height[stack.peek()]) {int top = stack.pop();if (stack.isEmpty())break;int distance = current - stack.peek() - 1;int bounded_height = Math.min(height[current], height[stack.peek()]) - height[top];ans += distance * bounded_height;}stack.push(current++);}return ans;}作者:LeetCode链接:https://leetcode-cn.com/problems/trapping-rain-water/solution/jie-yu-shui-by-leetcode/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

