LC42—接雨水

46 阅读1分钟

42. 接雨水

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

思路:

  • 使用双指针,一次遍历
  • 计算当前柱子,左边的柱子最高的高度,右边的柱子最高的高度
  • 能存水,需要当前柱子高度小于左右两边最高柱子高度的最小值
  • 存水量,min(lmax, rmax) - height[i]
  • 时间复杂度O(n)

解答:

public int trap(int[] height) {
    //使用双指针
    int left = 0;
    int right = height.length - 1;
    int lmax = height[left];
    int rmax = height[right];
    int sum = 0;
    while (left < right) {
        lmax = Math.max(height[left], lmax);
        rmax = Math.max(height[right], rmax);

        if (lmax < rmax) {
            sum = sum + lmax - height[left];
            left++;
        } else {
            sum = sum + rmax - height[right];
            right--;
        }
    }
    return sum;
}