zoukankan      html  css  js  c++  java
  • 【Trapping Rain Water】cpp

    题目

    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.

    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!

    代码

    class Solution {
    public:
        int trap(vector<int>& height) {
                // non valid input
                int len = height.size();
                if (len<=2) return 0;
                // initial
                int left_max[height.size()];
                int right_max[height.size()];
                left_max[0] = 0;
                right_max[len-1] = 0;
                // get left_max and right_max
                for (int i = 1; i < len; ++i)
                {
                    left_max[i] = std::max(left_max[i-1], height[i-1]);
                    right_max[len-i-1] = std::max(right_max[len-i], height[len-i]);
                }
                // calculate the sum
                int sum = 0;
                for (int i = 0; i < len; ++i)
                {
                    int h = std::min(left_max[i], right_max[i]);
                    if (h>height[i])
                    {
                        sum += h-height[i];
                    }
                }
                return sum;
        }
    };

    Tips:

    1. 遍历,获得每个位置上左边最高的和右边最高的;选择左边和右边比较小的高度,减去该位置的高度,就是可需水量。

    2. 注意一些极端case的处理

    =================================================

    第二次过这道题,思路没有完全记清,稍微捡了一下思路,一次AC。

    class Solution {
    public:
        int trap(vector<int>& height) {
                if ( height.size()<3 ) return 0;
                // left height
                vector<int> l(height.size(),0);
                int l_heighest = 0;
                for ( int i=0; i<height.size(); ++i )
                {
                    l_heighest = std::max(l_heighest, height[i]);
                    l[i] = l_heighest;
                }
                // right height
                vector<int> r(height.size(),0);
                int r_heighest = 0;
                for ( int i=height.size()-1; i>=0; --i )
                {
                    r_heighest = std::max(r_heighest, height[i]);
                    r[i] = r_heighest;
                }
                // total trapping water
                int ret = 0;
                for ( int i=0; i<height.size(); ++i )
                {
                    int h = std::min(l[i], r[i]);
                    ret += h - height[i];
                }
                return ret;
        }
    };

    tips:

    这道题就是一句话口诀:左右短的,减去当前位置高度,等于当前位置可需水量。

  • 相关阅读:
    C#操作REDIS例子
    A C# Framework for Interprocess Synchronization and Communication
    UTF8 GBK UTF8 GB2312 之间的区别和关系
    开源项目选型问题
    Mysql命令大全——入门经典
    RAM, SDRAM ,ROM, NAND FLASH, NOR FLASH 详解(引用)
    zabbix邮件报警通过脚本来发送邮件
    centos启动提示unexpected inconsistency RUN fsck MANUALLY
    rm 或者ls 报Argument list too long
    初遇Citymaker (六)
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4457356.html
Copyright © 2011-2022 走看看