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.

42. Trapping Rain Water

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
当一道题答案都看不懂的时候是沮丧的,但这就是事实,还要继续努力,先把代码背过。
class Solution {
    public int trap(int[] height) {
        int res = 0, mx = 0, n = height.length;
        int[] dp = new int[n];
        for (int i = 0; i < n; ++i) {
            dp[i] = mx;
            mx = Math.max(mx, height[i]);
        }
        mx = 0;
        for (int i = n - 1; i >= 0; --i) {
            dp[i] = Math.min(dp[i], mx);
            mx = Math.max(mx, height[i]);
            if (dp[i] - height[i] > 0) res += dp[i] - height[i];
        }
        return res;
    }
}

Grandyang大佬的dp算法,明天看看dp算法的内容

http://www.cnblogs.com/grandyang/p/4402392.html

https://blog.csdn.net/u013309870/article/details/75193592

Brute force 可以看懂,原理还没搞明白

 int ans = 0;
    int size = height.size();
    for (int i = 1; i < size - 1; i++) {
        int max_left = 0, max_right = 0;
        for (int j = i; j >= 0; j--) { //Search the left part for max bar size
            max_left = max(max_left, height[j]);
        }
        for (int j = i; j < size; j++) { //Search the right part for max bar size
            max_right = max(max_right, height[j]);
        }
        ans += min(max_left, max_right) - height[i];
    }
    return ans;

index从1到size-2,取每个元素左边和右边最大数中的较小值,减去当前数,加起来就是。


上一篇:Codeforces Round #703 (Div. 2)__ B. Eastern Exhibition__ 纯纯的思维


下一篇:Eastern Exhibition-(二维中位数)