Array - 42. Trapping Rain Water Hard

时间:2022-07-25
本文章向大家介绍Array - 42. Trapping Rain Water Hard,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

42. Trapping Rain Water

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1] Output: 6

思路:

题目意思是给定一个数组,数值代表了高度,求解可以装多少水,仔细分析可以发现,对于任意一位能存储多少水是取决于左右当前元素左右两边最大值的最小值来减去当前元素就是当前节点能装多少水,公式就类似:trap[i] = min(maxHight(0,i-1), maxHight(i+1, n)) - height[i]trap[i]是当前位置可以装多少水,maxHight就分别是左右两边的最大高度,采用首尾指针,通过标记左右最大高度来计算是否可以。

代码:

java:

class Solution {

    public int trap(int[] height) {
        if (height == null || height.length <= 1) return 0;
        
        int res = 0;
        int leftMax = 0;
        int rightMax = 0;
        
        for (int left = 0, right = height.length-1; left < right;) {
            if (height[left] < height[right]) {
                leftMax = Math.max(leftMax, height[left]);
                res += leftMax - height[left++];
            } else {
                rightMax = Math.max(rightMax, height[right]);
                res += rightMax - height[right--];
            }
        }
        
        return res;
    }
}

go:

func trap(height []int) int {

    var res int
    if height == nil || len(height) == 0 {
        return res
    }
    
    leftMax := 0
    rightMax := 0
    left := 0
    right := len(height) - 1
    
    for left != right {
        if height[left] < height[right] {
            leftMax = max(leftMax, height[left])
            
            res += leftMax - height[left]
            left++
        } else {
            rightMax = max(rightMax, height[right])
            
            res += rightMax - height[right]
            right--
        }
    }
    
    return res
}

func max(i, j int) int {
    if i > j {
        return i
    }
    return j
}