Trapping Rain Water (Bar Height) -- LeetCode
2016-01-30 05:37
337 查看
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
![](http://www.leetcode.com/wp-content/uploads/2012/08/rainwatertrap.png)
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!
思路:使用两个指针left和right,分别从两端向中间靠拢。同时,记录left和right曾经到过的最高值。如果当前值并没有超过最高值,则将最高值与当前的差值作为水的量,并将指针加一(right指针是减一)。为了让这个方法有效(无效的情况是,指针后续遇见的bar都不会再高于最高值了,那么这些水根本存不起来),因此我们每次只移动left和right中矮的那一个(如果两者相等,则移动left)。这样,一定能保证最后会碰到比最高值要高的bar(至少是等高),因为我们移动的是矮的那个指针,往前移动肯定最后会遇见另一个高的指针。
bar height问题:这是Amazon面试中的一道问题。求最高的液面高度。这里只需要把上方的代码修改一下就可以用。就是在res值变更时,若max与当前高度差值非零时,记录下max值,最后最高的max值就是结果。
For example,
Given
[0,1,0,2,1,0,1,3,2,1,2,1], return
6.
![](http://www.leetcode.com/wp-content/uploads/2012/08/rainwatertrap.png)
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!
思路:使用两个指针left和right,分别从两端向中间靠拢。同时,记录left和right曾经到过的最高值。如果当前值并没有超过最高值,则将最高值与当前的差值作为水的量,并将指针加一(right指针是减一)。为了让这个方法有效(无效的情况是,指针后续遇见的bar都不会再高于最高值了,那么这些水根本存不起来),因此我们每次只移动left和right中矮的那一个(如果两者相等,则移动left)。这样,一定能保证最后会碰到比最高值要高的bar(至少是等高),因为我们移动的是矮的那个指针,往前移动肯定最后会遇见另一个高的指针。
class Solution { public: int trap(vector<int>& height) { if (height.size() == 0) return 0; int left = 0, right = height.size() - 1, res = 0; int maxleft = height[left], maxright = height[right]; while (left < right) { if (height[left] <= height[right]) { if (height[left] > maxleft) maxleft = height[left]; else res += maxleft - height[left]; left++; } else { if (height[right] > maxright) maxright = height[right]; else res += maxright - height[right]; right--; } } return res; } };
bar height问题:这是Amazon面试中的一道问题。求最高的液面高度。这里只需要把上方的代码修改一下就可以用。就是在res值变更时,若max与当前高度差值非零时,记录下max值,最后最高的max值就是结果。
class Solution { public: int trap(vector<int>& height) { if (height.size() == 0) return 0; int left = 0, right = height.size() - 1, res = 0; int maxleft = height[left], maxright = height[right]; while (left < right) { if (height[left] <= height[right]) { if (height[left] > maxleft) maxleft = height[left]; else if (maxleft - height[left] > 0) res = max(res, maxleft); left++; } else { if (height[right] > maxright) maxright = height[right]; else if (maxright - height[right] > 0) res = max(res, maxright); right--; } } return res; } };
相关文章推荐
- 夺命雷公狗---微信开发15----编写进行创建自定义菜单
- ero-configuration Web Application Debugging with Xdebug and PhpStorm
- ios不用创建UIWebView快速获取系统标准User-Agent
- 《Android开发艺术探索》读书笔记 (1) 第1章 Activity的生命周期和启动模式
- Unity5 GI与PBS渲染从用法到着色代码
- BZOJ4068 : [Ctsc2015]app
- android和javascript之间相互通信实例分析
- android和javascript之间相互通信实例分析
- Swift继承
- android和javascript之间相互通信实例分析
- Android开发JDBC连接mysql数据库导入驱动方法
- android原生TabLayout+viewpaper+fragment实现滑动效果
- 献给初学iOS的小盆友们——微博app项目开发之十五微博配图
- Swift方法
- 安卓开发——AndroidStudio中获取联网权限
- Android使用videoview播放res/raw下的视频
- unity2DStudyTip
- iOS 本地通知
- Android开发辅助工具之GitHub
- 1、OMD安装(check mk+nagios+...) ,版本:RHEL7+OMD1.2.4p5