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!

思路:

  这一道题类似于leetcode 11 题Container With Most Water.  要求最多能装多少水.有两种思路.

  思路一:

    先从左往右遍历.每遍历一个数字,就贪心得到这个数字所在的格子能最多装水. 由于是从左到右遍历,我们只考虑的左边的高度,没有考虑右边的高度(实际应该选择两者小的那个). 因此需要再从右往左遍历,同样贪心这个数字所在格子

  最多能装多少水,这次以右边高度为准. 最终综合从左到右和从右到左的结果,取两者小的.

代码:(runtime 19ms)

 class Solution {
public:
int trap(vector<int>& height) {
vector<int> leftToRight;
vector<int> rightToLeft;
aux_function(height.begin(), height.end(), leftToRight); aux_function(height.rbegin(), height.rend(), rightToLeft); int ans = ;
auto it1 = leftToRight.begin();
auto it2 = rightToLeft.rbegin(); while (it1 != leftToRight.end()){
ans += min(*it1++, *it2++);
}
return ans;
} private:
template<class Iter>
void aux_function(Iter begin, Iter end, vector<int> &ret) {
int left = ;
for (auto it = begin; it != end; it++) {
left = left > *it ? left : *it;
ret.push_back(left - *it);
}
}
};

  思路二:

    如上图中所示, 先求黑色格子与蓝色格子的总面积,然后再减去黑色各自面积.

代码:(runtime 10ms)

  

class Solution {
public:
int trap(vector<int> A) {
int n = A.size();
int summap = ;
int sumtot = ; for(int i = ; i < n; i++) summap += A[i]; int left = , right = n - ;
int leftbar = , rightbar = ;
while(left <= right) {
leftbar = max(A[left], leftbar);
rightbar = max(A[right], rightbar); if(leftbar <= rightbar) {
sumtot += leftbar;
left++;
//right--;
} else {
sumtot += rightbar;
right--;
//left++;
}
} return sumtot - summap;
}
};

leetcode problem 42 -- Trapping Rain Water的更多相关文章

  1. [Leetcode][Python]42: Trapping Rain Water

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 42: Trapping Rain Waterhttps://oj.leetc ...

  2. 【LeetCode】42. Trapping Rain Water

    Trapping Rain Water Given n non-negative integers representing an elevation map where the width of e ...

  3. 【一天一道LeetCode】#42. Trapping Rain Water

    一天一道LeetCode系列 (一)题目 Given n non-negative integers representing an elevation map where the width of ...

  4. 【LeetCode】42. Trapping Rain Water 接雨水 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力求解 保存左右最大值 单调栈 日期 题目地址:ht ...

  5. LeetCode OJ 42. Trapping Rain Water

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  6. LeetCode - 42. Trapping Rain Water

    42. Trapping Rain Water Problem's Link ------------------------------------------------------------- ...

  7. leetcode#42 Trapping rain water的五种解法详解

    leetcode#42 Trapping rain water 这道题十分有意思,可以用很多方法做出来,每种方法的思想都值得让人细细体会. 42. Trapping Rain WaterGiven n ...

  8. [array] leetcode - 42. Trapping Rain Water - Hard

    leetcode - 42. Trapping Rain Water - Hard descrition Given n non-negative integers representing an e ...

  9. LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))

    LeetCode 42. Trapping Rain Water Python解法 解题思路: 本思路需找到最高点左右遍历,时间复杂度O(nlogn),以下为向左遍历的过程. 将每一个点的高度和索引存 ...

随机推荐

  1. 详解UML中的聚合,关联,泛化等关系

    1. Overview UML设计类中,类的关系分为Generalization(泛化),Dependency(依赖关系).Association(关联关系).Aggregation(聚合关系).Co ...

  2. JS保留两位小数 四舍五入函数

    js 四舍五入函数 toFixed(),里面的参数 就是保留小数的位数. <script language="javascript"> document.write(& ...

  3. POJ 1329 三角外接圆

    Circle Through Three Points Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3169   Acce ...

  4. Ajax防止重复提交

    转:http://www.cnblogs.com/jinguangguo/archive/2013/05/20/3086925.html 谈谈防止重复点击提交   首先说说防止重复点击提交是什么意思. ...

  5. XStream将xml文件拼成字符串

      1.引入的包 <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId&g ...

  6. mysql中相关,无关子查询,表与表之间的关系以及编码和乱码的解决

    ※MySQL中的字符编码(注意,utf8中没有'-',跟Java中不一样)SHOW VARIABLES; //查看系统变量//查询字符编码相关的系统变量SHOW VARIABLES WHERE var ...

  7. java1.5新特性

    一:增强for循环 增强for的格式:for(数据类型    变量名:集合或者 数组){              } 传统的for循环可以对数组进行遍历: for(int x=0;x { Syste ...

  8. [转]oracle的ANYDATA数据类型

    本文转自:http://blog.csdn.net/yuzhenhuan01/article/details/6606106 ANYDATA数据类型是个有点奇特的类型,你可以把不同数据类型的数据通过转 ...

  9. uiatuomator命令启动apk,与查找多个相同控件

    背景:在做项目时,发现使用uiatuomator中遇到了一些问题,现在把解决方法和思路分享出来 案列1:使用命令去启动要运用的apk包 在做自动化时,需要通过命令去启动APK的包,我使用的是sdk中自 ...

  10. Ubuntu lnmp安装记录

    参考了: Ubuntu 14.04 LTS 安装 LNMP Nginx\PHP5 (PHP-FPM)\MySQL 在访问 info.php的时候,我显示的是502错误.后面我参考了: Ubuntu15 ...