高频刷题-42. Trapping Rain Water

高频刷题-42. Trapping Rain Water

https://leetcode.com/problems/trapping-rain-water/

这个问题我们采用的算法是全局遍历,找到最高点所在的index,然后对于左侧和右侧,分别计算蓄水量。对于左侧,蓄水量为左侧最大高度 – 当前高度,然后将蓄水量相加;右侧也是一样,从右向左遍历,蓄水量为右侧最大高度 – 当前高度。最后结果是左右之和。

具体看代码,加了注释,很容易看懂。

public int trap(int[] height) {
        
        int hightest_index = 0;
        int left_hightest = 0;
        int right_hightest = 0;
        int water = 0;
        
        // 计算全局最高的位置index,对于最高点左侧和右侧,分开进行蓄水计算。
        // 由于木桶原理,左侧和右侧能蓄水的数量,和左侧、右侧的高度差有关
        for (int i = 0; i < height.length; i++) {
            if (height[hightest_index] < height[i]) hightest_index = i;
        }
        
        // 计算左侧最低的高度,对于低于这个高度的地区,计算water的值
        for (int i = 0; i < hightest_index; i++) {
            if (height[i] > left_hightest) {
                left_hightest = height[i];
            } else {
                water += left_hightest - height[i];      
            }
        }
        
        // 遍历最高点右侧,只需要考虑右侧最高的挡板高度
        for (int i = height.length - 1; i > hightest_index; i--) {
            if (height[i] > right_hightest) {
                right_hightest = height[i];
            } else {
                water += right_hightest - height[i];
            }
        }
        return water;
    }

 

上一篇:Linux C getline, gets, fgets 函数区别


下一篇:c++数字雨屏保