【LeetCode】042 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.
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.
题解:
遍历数组,找到局部最小值,方法是如果当前值大于或等于前一个值,或者当前值大于后一个值则跳过。找到了局部最小值后,然后向左找左边的最大值,再向右找右边的最大值,找右边最大值时要注意当其大于左边最大时就停止寻找。然后算出从左边最大值到右边最大值之间能装的水量,之后从右边最大值的位置开始继续找局部最小值,以此类推直到遍历完整个数组。(from here)Solution 1 中height[i] > height[i + 1]是为了避免若为>=,则数组为[5,5,1,7, 1, 1, 5,2,7,6]情况,没有=为23,有=为7;
Solution 1()
class Solution {
public:
int trap(vector<int>& height) {
int result = , n = height.size(), left = , right = ;
for(int i=; i<n-; i++) {
if(height[i] >= height[i-] || height[i] > height[i+]) continue;
for(left = i-; left>; --left) {
if(height[left]>=height[left-]) break;
}
right = i + ;
for(int j=i+; j<n; ++j) {
if(height[j]>=height[right]) {
right = j;
if(height[right]>=height[left]) break;
}
}
int h = min(height[left],height[right]);
for(int k=left+; k<right; ++k) {
if(h>height[k]) result += h - height[k];
}
i = right;
}
return result;
}
};
对于每一个值,其与另外两个值组成的容器收集的雨水最大量肯定是在其左右两边的最大值作为容器的两个壁的情况下获得的,具体在题目里就是这两个最大值的较小值与当前值的差(当这个最小值大于当前值时,否则收集不到雨水)。使用动态规划,初始化一维数组vector<int> dp(n,0)。然后遍历两遍数组,第一次遍历从左边扫描找出当前位置左边的最大值,并存放到dp中;第二次遍历从右边扫描找出当前位置右边的最大值,然后与dp中保存的左边最大值比较,存下二者之中的较小值,并且将这个值与当前值比较,如果大于当前值,则收集的雨水总量应该加上这个较小值与当前值的差值。用一个数组 left[i] 表示第 i 根柱子左边最高的柱子的高度(from here)
用一个数组 right[i] 表示第 i 根柱子右边最高的柱子的高度
1.从左到右扫描,left[i] = max(left[i - 1], A[i - 1])
2.从右到左扫描,right[i] = max(right[i + 1], A[i + 1])
3.第 i 根柱子上能储蓄的水为 min(left[i], right[i]) - A[i],因为这时 left[i] 已经没用了,可以用它来存放这个值。(from here)
复杂度:时间O(n), 空间O(n)
Solution 2 ()
class Solution {
public:
int trap(vector<int>& height) {
int result = , lmax = , rmax = , n = height.size();
vector<int> dp(n,);
for(int i=; i<n; i++) {
dp[i] = lmax;
lmax = max(lmax, height[i]);
}
for(int i=n-; i>=; i--) {
dp[i] = min(dp[i], rmax);
rmax = max(rmax, height[i]);
if(dp[i] > height[i]) {
result += dp[i] - height[i];
}
}
return result;
}
};
根据上面的雨水收集的分析,任意3个值组成的雨水收集量即是两边的较小值与中间值的差值(如果前者大于后者)。因此可以设置两个指针从两头往中间遍历,这两个指针所指的值即为容器的两个壁。低的壁(较小值)决定了收集雨水的量,因此中间值设为从较小值的后续值,并且算出收集的雨水,直到遇到一个值大于这个较小值,并且更新较小值为当前值。这样只需一趟扫描就可以解决问题。(from here)
Solution 3 ()
class Solution {
public:
int trap(vector<int>& height) {
int result = , left = , right = height.size() - ;
while (left < right) {
int h = min(height[left], height[right]);
if (h == height[left]) {
++left;
while (left < right && height[left] < h) {
result += h - height[left++];
}
} else {
--right;
while (left < right && height[right] < h) {
result += h - height[right--];
}
}
}
return result;
}
};
The idea is:
1) find the highest bar.
2) traverse the bar from left the highest bar.becasue we have the highest bar in right, so, any bar higher than its right bar(s) can contain the water.
3) traverse the bar from right the highest bar.becasue we have the highest bar in left, so, any bar higher than its left bar(s) can contain the water. (from here ChenHao)
Solution 4 ()
class Solution {
public:
int trap(vector<int>& height) {
int result = , maxhigh = , maxidx = , n = height.size();
for(int i=; i<n; i++) {
if(height[i] > maxhigh) {
maxhigh = height[i];
maxidx = i;
}
}
int prehigh = ;
for(int i=; i<maxidx; ++i) {
if(height[i] > prehigh) {
prehigh = height[i];
}
result += (prehigh - height[i]);
}
prehigh = ;
for(int i=n-; i>maxidx; --i) {
if(height[i] > prehigh) {
prehigh = height[i];
}
result += (prehigh - height[i]);
}
return result;
}
};
Solution 5 ()
class Solution {
int trap(vector<int>& height) {
int l = , r = height.size()-, level = , water = ;
while (l < r) {
int lower = height[height[l] < height[r] ? l++ : r--];
level = max(level, lower);
water += level - lower;
}
return water;
}
}
【LeetCode】042 Trapping Rain Water的更多相关文章
- 【LeetCode】42. Trapping Rain Water
Trapping Rain Water Given n non-negative integers representing an elevation map where the width of e ...
- 【LeetCode】42. Trapping Rain Water 接雨水 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力求解 保存左右最大值 单调栈 日期 题目地址:ht ...
- 【一天一道LeetCode】#42. Trapping Rain Water
一天一道LeetCode系列 (一)题目 Given n non-negative integers representing an elevation map where the width of ...
- 【Lintcode】364.Trapping Rain Water II
题目: Given n x m non-negative integers representing an elevation map 2d where the area of each cell i ...
- 【Lintcode】363.Trapping Rain Water
题目: Given n non-negative integers representing an elevation map where the width of each bar is 1, co ...
- LeetCode 042 Trapping Rain Water
题目要求:Trapping Rain Water Given n non-negative integers representing an elevation map where the width ...
- [Leetcode][Python]42: Trapping Rain Water
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 42: Trapping Rain Waterhttps://oj.leetc ...
- 【LeetCode题意分析&解答】42. Trapping Rain Water
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- LeetCode OJ 42. Trapping Rain Water
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
随机推荐
- 去掉activity默认动画效果的方法
非常多手机都会自带一些Activity切换动画,项目中假设我们须要禁用掉系统Activity切换的动画.能够使用例如以下方法: 一.重写Activity的Them中的windowAnimationSt ...
- Tomcat安装与IDEA中的配置
下载Tomcat 先从http://tomcat.apache.org/上下载tomcat9,根据你的系统版本来下载. 本地安装 下载之后解压到你的软件安装目录中,这是我的例子: 然后设置环境变量,如 ...
- 让uboot的tftp支持上传功能
转载:http://blog.chinaunix.net/uid-20737871-id-2124122.html uboot下的tftp下载功能是非常重要和常见的功能.但是偶尔有些特殊需求的人需要使 ...
- 解决php网页运行超时问题:Maximum execution time of 30 seconds exceeded
Fatal error: Maximum execution time of 30 seconds exceeded in C:\Inetpub\wwwroot\ry.php on line 11 意 ...
- centOS中修改语言环境
在终端中打开 键入 vim ~/.bashrc 在最后一行键入 export LANG="zh_CH.UTF-8"
- Go 语言从新手到大神:每个人都会踩的五十个坑(转)
Go语言是一个简单却蕴含深意的语言.但是,即便号称是最简单的C语言,都能总结出一本<C陷阱与缺陷>,更何况Go语言呢.Go语言中的许多坑其实并不是因为Go自身的问题.一些错误你再别的语言中 ...
- iOS开发 viewWillAppear:(BOOL)animated真机调试的时候不执行了怎么办
本文转载至http://blog.sina.com.cn/s/blog_a843a8850101e0g7.html 现在需要的.h文件里面加上. 然后,在需要的.m文件按里面加上关键代码:self ...
- iOS:苹果企业证书通过网页分发安装app
本文转载至 http://blog.sina.com.cn/s/blog_6afb7d800101fa16.html 苹果的企业级证书发布的应用,是不用设备授权即可直接安装,并且不限设备上限.为了方便 ...
- Ioc容器Autofac系列
1.http://blog.csdn.net/xingxing513234072/article/details/9211969 2.asp.net mvc中整合autofachttp://blog. ...
- segnet 编译与测试
segnet 编译与测试参考:http://sunxg13.github.io/2015/09/10/caffe/http://m.blog.csdn.net/lemianli/article/det ...