力扣---42. 接雨水

发布时间 2023-07-23 15:31:31作者: Owlwu

给定 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;
    }
}