给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [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:
输入:height = [4,2,0,3,2,5] 输出:9
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
双向指针,由于所有的柱子是从最底下往上升的,所以不用考虑底部镂空且被封闭的问题。
从左往最高处,不断记录当前的最高点,最高点到之后的路径中高度的差值即是可以装水的地方。
从右往最高处同理。
public class Leet42接雨水 { public int trap(int[] height) { // 左边的答案 int resLeft = 0; // 右边的答案 int resRight = 0; // 左指针 int left = 0; // 右指针 int right = height.length - 1; // 左边的当前最高值 int leftHeight = height[left]; // 右边的当前最高值 int rightHeight = height[right]; while (left < right) { // 哪边小就移动哪边,保证最高点始终在两点中间。 if (leftHeight < rightHeight) { left ++; // 如果有差值,加到对应的答案中,如果当前的高于最高值,则更新最高值。右边的同理。 if (height[left] < leftHeight) { resLeft += leftHeight - height[left]; } else { leftHeight = height[left]; } } else { right --; if (height[right] < rightHeight) { resRight += rightHeight - height[right]; } else { rightHeight = height[right]; } } } return resLeft + resRight; } }
标签:rightHeight,---,right,int,42,height,力扣,leftHeight,left From: https://www.cnblogs.com/allWu/p/17575068.html