【LeetCode】42.接雨水

题目描述:

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

 

 

【LeetCode】42.接雨水_第1张图片

算法思想:参考https://blog.csdn.net/i000zheng/article/details/79725417

使用两根指针:

1. 一根从右往左,更新记录从位置i往右边的峰值;

2. 一根从左往右遍历。更新从位置i往左边峰值的同时,计算位置i处可以积水多少;

3. 水面高度h应为min(maxL,maxR)。积水应为max(0,h-height[I]);

class Solution {
    public int trap(int[] height) {
        if(height == null || height.length <= 2)
            return 0;
        int maxL = height[0];
        int[] maxRs = new int[height.length];
        int waterSum = 0;//计算总的水量
        int maxR = 0;
        for(int i = height.length - 1; i >= 0; i--){
            if(height[i] > maxR) {
                maxRs[i] = maxR = height[i];
            }
            else {
                maxRs[i] = maxR;
            }
        }
        for(int i = 1; i < height.length - 1; i++){
            if(height[i] > maxL) {
                maxL = height[i];//更新左边最大值
            }
                waterSum += Math.max(Math.min(maxL, maxRs[i]) - height[i], 0);
        }
        return waterSum;
        
      }

}

你可能感兴趣的:(学习笔记)