给定一个数组,表示连续的地表的高度,求当下雨时,这个连续的地表最多能蓄多少水,比如给定数组[0,1,0,2,1,0,1,3,2,1,2,1]得到结果为6,如下图所示:


分析
对于每个柱子,找到其左右两边最高的柱子,该柱子能容纳的面积就是min(max_left, max_right) - height,这个是问题的本质所在,理解了这个下面的方法就容易理解了。 
方法一(三遍扫描):
1. 从左往右扫描一遍,对于每个柱子,求取左边最大值;
2. 从右往左扫描一遍,对于每个柱子,求最大右值;
3. 再扫描一遍,把每个柱子的面积并累加。
代码如下:

int totalWater(vector<int>& vec){

if(vec.size() < 3)

return 0;

vector<int> leftMax(vec.size()),rightMax(vec.size());

leftMax[0] = vec[0];

rightMax[vec.size()-1] = vec[vec.size()-1];

for(int i = 1;i<vec.size()-1;i++){

leftMax[i] = max(leftMax[i-1],vec[i]);

rightMax[vec.size()-1-i] = max(rightMax[vec.size()-i],vec[vec.size()-1-i]);

}

leftMax[vec.size()-1] = max(leftMax[vec.size()-2],vec[vec.size()-1]);

rightMax[0] = max(rightMax[1],vec[0]);

int sum = 0;

for(int i = 0;i<vec.size();i++)

sum += (min(leftMax[i],rightMax[i]) - vec[i]);

return sum;

}

说明:代码中将第一次和第二次扫描合并为一次扫描,但是本质上的计算次数没有减少,思路还是跟方法一说明的一样

方法二(一遍扫描):
1. 设定两个指针,初始时分别指向数组的头和尾,并将它们指向的值分别设为左边最大的值和右边最大的值。
2. 比较两个指针指向的值的大小,将值较小的指针向前移动(对头指针来说是加操作,对尾指针来说是减操作),接着判断新移动的指针指向的值与左边最大值或者右边最大值比较(如果移动的指针是左指针则与左最大值比较,如果移动的指针是右指针则与右指针比较),如果大于最大值则更新相应最大值,否则计算 min(max_left, max_right) - height得到当前位置的蓄水量,并累加。
3. 递归循环第二部,直到两指针相遇。
代码如下:

int totalWater2(vector<int>& vec){

if(vec.size() < 3)

return 0;

int leftMax = vec[0],rightMax = vec[vec.size()-1];

int left = 0,right = vec.size()-1;

int sum = 0;

while(left < right){

if(vec[left] > vec[right]){

right--;

if(vec[right]<rightMax){

sum += (min(leftMax,rightMax)-vec[right]);

}else{

rightMax = vec[right];

}

}else{

left++;

if(vec[left]<leftMax){

sum += (min(leftMax,rightMax)-vec[left]);

}else{

leftMax = vec[left];

}

}

}

return sum;

}

说明:方法二减少了遍历数组的次数,只有一次遍历就能完成,应该是最优方法。

本人水平有限,文章有错误的地方欢迎大家指出,有问题也希望大家能够留言交流,一起学习进步

水池蓄水问题(Trapping Rain Water)相关推荐

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

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

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

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

  3. Leetcode 动态规划 Trapping Rain Water

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie Trapping Rain Water Total Accepted: 14568 Tota ...

  4. 【重点:BFS】LeetCode 407. Trapping Rain Water II

    LeetCode 407. Trapping Rain Water II 博客转载自:http://www.cnblogs.com/grandyang/p/5928987.html [太难了,被智商碾 ...

  5. 【重点:DP 双指针 栈】LeetCode 42. Trapping Rain Water

    LeetCode 42. Trapping Rain Water 本博客转载自:http://www.cnblogs.com/grandyang/p/4402392.html [自己又不会做,抄的-& ...

  6. LeetCode 42 Trapping Rain Water 收集雨水

    LeetCode 42 Trapping Rain Water 收集雨水 Given n non-negative integers representing an elevation map whe ...

  7. Leetcode 407. Trapping Rain Water II 收集雨水2 解题报告

    1 解题思想 我看了下题目,发现比预想中的简单,加之我比较烂,所以其实我还是没做,只是看懂了上回贴的代码,然后做了一下注释,现在我来讲下题目. 首先请看下上一题,上一题是2D的这题是3D的: Leet ...

  8. LeetCode42. Trapping Rain Water

    LeetCode42. Trapping Rain Water 原题地址 题目描述 Given n non-negative integers representing an elevation ma ...

  9. [leetcode]Trapping Rain Water @ Python

    原题地址:https://oj.leetcode.com/problems/trapping-rain-water/ 题意: Given n non-negative integers represe ...

  10. 【leetcode】42. Trapping Rain Water 计算坑洼地的积水量

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

最新文章

  1. esp32 python-ESP32教程:MicroPython支持
  2. Spring8:一些常用的Spring Bean扩展接口
  3. 登录页面html代码_【网络自动化平台开发】—— 登录组件
  4. halcon 单通道图像转成3通道_halcon图像处理基本运算
  5. 基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
  6. leetcode 34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
  7. java的栈图形演示
  8. 牵手大众、现代,滴滴绯闻“女友”Aurora无人车启动商业化
  9. MPEG2简单码流分析
  10. RPM、SRPM和YUM,linux包rpm包管理工具
  11. C语言程序设计(第三版)何钦铭著 习题2-2
  12. 学习Linux命令(11) startx
  13. chipseq MACS2 call peaks 报错解决方法——创建虚拟环境
  14. QQ图片文件夹说明及清理
  15. ffmpeg 视频去水印
  16. 软件需求分析(以美团外卖为例)
  17. TMC5160/5130驱动芯片使用简明指南
  18. IOS ANDROID WINDOWS PHONE国内格局的悄然变化-应用电台www.apphub.fm
  19. Java单个文件下载
  20. Vue | 18.本地应用 - 小黑记事本

热门文章

  1. ai智能医疗产业_人工智能以减少医疗错误
  2. 知识付费的七种变现方式
  3. Java一瓶可乐_Java实现可乐瓶问题
  4. 服务器请求微信后台(api.weixin.qq.com)过慢处理
  5. signature=4209f9d53642a2c1cdf0e4a92ba622eb,HIERBA GUINEA (Panicum maximum Jacq.)
  6. 来自Google持续更新中的TCP BBR v2.0最新进展
  7. Beta冲刺-第四天
  8. Chef学习之三:Chef基础知识 (转贴)
  9. Python爬取系列妹子图实战总结(程序员节福利哟)
  10. 百度地圖定位setScanSpan無效的問題