LeetCode_Hot100_Demo042接雨水(hard)

2021/7/16  连续打卡的第二天  真不戳

在好多面经中都看到过这道经典的接雨水题,但每每看到这个hard标志,就会望而却步

计得前一段时间的leetcode每日一题有一个相似的题,做过了之后,便将目光伸向了此题

 

不出所料,刚一开始我便将此题与之前的题搞混在一起

 

 

 这道Demo11题是将数组从两侧用双指针遍历,最终算得两个下标差乘以之间的距离的最大值

但是明显与此题不符

后来看了题解我才读懂这道接雨水的意思

计算所有空处所能接的雨水的总和值,这样的话,就要计算每个下标处所能承的水量

这里水量用了leftmax和rightmax中的最小值来减去当前位置的height得到

leftmax定义为i处左侧的柱最高值

public class Solution {
    public int trap(int[] height) {
        int n = height.length;
        if (n == 0) return 0;
        int[] leftMax = new int[n];
        //定义leftmax为i处左侧最大值
        leftMax[0] = height[0];
        for (int i = 1; i < n; i++) {
            leftMax[i] = Math.max(leftMax[i - 1], height[i]);
        }
        //定义rightmax为i处右侧最大值
        int[] rightMax = new int[n];
        rightMax[n - 1] = height[n - 1];
        for (int i = n - 2; i >= n - 2; i--) {
            rightMax[i] = Math.max(rightMax[i + 1], height[i]);
        }
        /**
         * i处可接得的雨水值为leftmax和rightmax的最小值减去i处的height
         * 定义ans为可接得的总雨水值,遍历数组,将每个i处可接得的雨水值加和,最后返回
         */
        int ans = 0;
        for (int i = 0;i < n;i++){
            ans += Math.min(leftMax[i], rightMax[i]) - height[i];
        }
        return ans;
    }

}

  

 

posted @ 2021-07-16 23:05  Leexinyang  阅读(70)  评论(0)    收藏  举报