42. Trapping Rain Water
2016-04-30 15:18
399 查看
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!
Subscribe to see which companies asked this question
分析:
这个题目看得懂别人的解法,却不能证明正确性。
分别维护左右两边的标记l,r,每次去a[l]与a[r]中的小者,假设a[l]<a[r],对l的左边延伸,若l的右边小于a[l],则用a[l]去减就是装水的地方。一直延伸到l的右边某个点大于左边,停止。反之亦然。
我觉得需要注意的是,最外层的while判断条件,是等于也没关系,因为里面还会保证相等也不会有影响。
代码:
class Solution {
public:
int trap(vector<int>& A) {
int l=0,r=A.size()-1,res=0;
while(l<r)
4000
{
int minn=min(A[l],A[r]);
if(minn==A[l])
{
while(++l<r&&A[l]<=minn)
res+=minn-A[l];
}
else
{
while(l<--r&&A[r]<=minn)
res+=minn-A[r];
}
}
return res;
}
};
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!
Subscribe to see which companies asked this question
分析:
这个题目看得懂别人的解法,却不能证明正确性。
分别维护左右两边的标记l,r,每次去a[l]与a[r]中的小者,假设a[l]<a[r],对l的左边延伸,若l的右边小于a[l],则用a[l]去减就是装水的地方。一直延伸到l的右边某个点大于左边,停止。反之亦然。
我觉得需要注意的是,最外层的while判断条件,是等于也没关系,因为里面还会保证相等也不会有影响。
代码:
class Solution {
public:
int trap(vector<int>& A) {
int l=0,r=A.size()-1,res=0;
while(l<r)
4000
{
int minn=min(A[l],A[r]);
if(minn==A[l])
{
while(++l<r&&A[l]<=minn)
res+=minn-A[l];
}
else
{
while(l<--r&&A[r]<=minn)
res+=minn-A[r];
}
}
return res;
}
};
相关文章推荐
- C++ Vector用法详解
- 大家注意vector, list, set, map成员函数erase
- java中vector与hashtable操作实例分享
- C++ vector删除符合条件的元素示例分享
- C++ Vector用法深入剖析
- vector与map的erase()函数详细解析
- vector,map,list,queue的区别详细解析
- C++ vector的用法小结
- stl容器set,map,vector之erase用法与返回值详细解析
- C++中vector的用法实例解析
- c++ vector(向量)使用方法详解(顺序访问vector的多种方式)
- 关于STL中vector容器的一些总结
- JAVA Vector源码解析和示例代码
- Java中的Vector和ArrayList区别及比较
- 浅谈 java中ArrayList、Vector、LinkedList的区别联系
- 重新认识java-Vector
- Java中Vector和ArrayList的区别
- Vector 还是ArrayList
- vector-list-deque
- java集合类Vector与Enumeration用法举例