码迷,mamicode.com
首页 > 移动开发 > 详细

Leetcode:Trapping Rain Water

时间:2014-06-10 08:48:04      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   java   

戳我去解题

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.

For example, 
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

bubuko.com,布布扣

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. 

 

解题分析:

对于每个柱子,找到其左右两边最高的柱子,该柱子能容纳的面积就是min(max_left, max_right) - height

我们从前往后遍历,对于每个柱子,我们可以时刻更新 其左边的最大值,但是 其右边的最大值,我们可以一次次的进行 std::max_element

但是这样  T(n) = O(n^2)

我们可以用空间换时间,首先用一个数组保存 每个柱子右边的最大值,这样 T(n) = O(n)

  1. bubuko.com,布布扣
    class Solution {
    public:
        int trap(int A[], int n) {
            assert(A != NULL && n >= 0);
            if (n <= 2) return 0;
            int leftMax = A[0];
            int rightMax[n];
            rightMax[n - 1] = A[n - 1];
            for (int i = n - 2; i >= 0; --i) {
                rightMax[i] = max(A[i+1], rightMax[i+1]);
            }
            int res = 0;
            for (int i = 1; i < n - 1; ++i) {
                leftMax = max(leftMax, A[i-1]);
                int tmp = min(leftMax, rightMax[i]);
                res += max(0, tmp - A[i]);
            }
            return res;
        }
    };
    bubuko.com,布布扣

     

Leetcode:Trapping Rain Water,布布扣,bubuko.com

Leetcode:Trapping Rain Water

标签:c   style   class   blog   code   java   

原文地址:http://www.cnblogs.com/wwwjieo0/p/3778620.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!