【leetcode】Trapping Rain Water(hard)
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.
思路:
我自己的想法,先遍历一遍数组找到所有的山峰位置,在例子中是1,3,7,10,然后再填充两个山峰之间的水,获得水量
class Solution {
public:
int trap(int A[], int n) {
bool haswater = false;
vector<int> peak;
int ans = ;
for(int i = ; i < n - ; i++) //找到第一个山峰
{
if(A[i] > A[i + ])
{
peak.push_back(i);
break;
}
}
if(peak.empty())
{
return ; //没有山谷 没水
}
int maxheight = A[peak[]];
for(int i = peak[] + ; i < n; i++) //找剩下的山峰
{
if(A[i] > A[i - ]) //比上一个值大 新山峰
{
while(A[i] > A[peak.back()] && A[peak.back()] < maxheight) //比之前的山峰高,且之前的山峰不是最高峰,删掉之前的 第一个山峰不能删
{
peak.pop_back();
}
maxheight = (A[i] > maxheight) ? A[i] : maxheight; //新的最高峰
peak.push_back(i);
}
}
for(int i = ; i < peak.size() - ; i++) //获得水量 依次向两个山峰间加水
{
int height = min(A[peak[i]], A[peak[i+]]); //水平面是两个山峰中矮一点的那个
for(int j = peak[i] + ; j < peak[i+]; j++)
{
ans += max(height - A[j], ); //防止5 4 1 2 这种水平面比中间非山峰处低的情况
}
}
return ans;
}
};
大神的思路:没有像我一样先找所有的山峰,而是边遍历边获得每个坐标位置的水量。 而且大神是左右两边收缩的。
class Solution {
public:
int trap(int A[], int n) {
int left=; int right=n-;
int res=;
int maxleft=, maxright=;
while(left<=right){ //没有遍历结束
if(A[left]<=A[right]){ //如果右边比较高 则处理左边
if(A[left]>=maxleft) maxleft=A[left]; //如果当前的值比左边最大值还大,那更新最大值 这个位置不会有水
else res+=maxleft-A[left]; //如果比左边最大值小那当前值一定在山谷 左边比左边最大值小 右边比右值小
left++;
}
else{
if(A[right]>=maxright) maxright= A[right];
else res+=maxright-A[right];
right--;
}
}
return res;
}
};
【leetcode】Trapping Rain Water(hard)的更多相关文章
- 【题解】【直方图】【Leetcode】Trapping Rain Water
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- 【leetcode】Trapping Rain Water
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))
LeetCode 42. Trapping Rain Water Python解法 解题思路: 本思路需找到最高点左右遍历,时间复杂度O(nlogn),以下为向左遍历的过程. 将每一个点的高度和索引存 ...
- leetcode#42 Trapping rain water的五种解法详解
leetcode#42 Trapping rain water 这道题十分有意思,可以用很多方法做出来,每种方法的思想都值得让人细细体会. 42. Trapping Rain WaterGiven n ...
- [array] leetcode - 42. Trapping Rain Water - Hard
leetcode - 42. Trapping Rain Water - Hard descrition Given n non-negative integers representing an e ...
- [LeetCode] 407. Trapping Rain Water II 收集雨水 II
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...
- [LeetCode] 42. Trapping Rain Water 收集雨水
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- [LeetCode] 407. Trapping Rain Water II 收集雨水之二
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...
- LeetCode - 42. Trapping Rain Water
42. Trapping Rain Water Problem's Link ------------------------------------------------------------- ...
随机推荐
- CSS 文字溢出时的自动隐藏
http://www.111cn.net/cssdiv/css/34050.htm 语法:overflow : visible | auto | hidden | scroll visible::不剪 ...
- new失败判断
使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为空;但是C++ 里,如果 new 分配内存失败,默认是抛出bad_alloc异常,不会返回空:但是有些编译器对c++标准支 ...
- Article Master Data Deviation
Site data – Logistics DC / Logistics Store Where is the reference site decided when you maintain the ...
- nodejs remote链接mysql数据库总结
nodejs链接远端mysql,这个折腾了一个上午才搞定.本以为,直接使用就OK了,但是发现不行,后来查阅各种资料后,终于找到了方法. nodejs链接远端数据库主要分为几个步骤: 1)安装node- ...
- awk!字符问题,修复中!.......
awk '条件类型1{动作1} 条件类型2{动作2}' file1 file2 变量名称:1.NF 每一行($0表示文本所有域)拥有的字段数. 2.NR目前awk处理的"第n行"数 ...
- js异步收集
http://www.cnblogs.com/rubylouvre/archive/2011/03/18/1984336.html http://www.cnblogs.com/hustskyking ...
- Jquery 禁用 a 标签 onclick 事件30秒后可用
<a href="javascript:;" id="sendToTel" >发送短信</a> <script type=&quo ...
- Android开发系列之按钮事件的4种写法
经过前两篇blog的铺垫,我们今天热身一下,做个简单的例子. 目录结构还是引用上篇blog的截图. 具体实现代码: public class MainActivity extends Activity ...
- C#使用Zxing2.0生成二维码 带简单中心LOGO
参考:http://www.open-open.com/lib/view/open1379214678162.html 代码:http://files.cnblogs.com/halo/%E4%BA% ...
- php下删除一篇文章生成的多个静态页面
php自定义函数之删除一篇文章生成的多个静态页面,可能有多页的文章,都是需要考虑到的. 复制代码代码如下: //– 删除一篇文章生成的多个静态页面 //– 生成的文章名为 5.html 5_2.ht ...