[LeetCode] Trapping Rain Water
2015-05-06 16:20
302 查看
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. Thanks Marcos for contributing this image!
解题思路:
1、我的办法:两边夹的思想,若左边小于右边,则移动左边的指针,否则移动右边的指针。同时,若移动的指针小于上一个最小高度,则容量减去该移动指针此时所指的高度。若移动的指针和未移动的指针都大于此前最小高度,则加上超出的部分。说的不明白,代码比较好理解:
class Solution {
public:
int trap(vector<int>& height) {
int len = height.size();
if (len<3){
return 0;
}
int start = 0, end = len - 1;
int result = 0, minH = 0;
minH = min(height[start], height[end]);
result = minH * (end - start - 1);
while (start<end - 1){
if (height[start]<height[end]){
start++;
result = result - min(minH, height[start]);
}
else{
end--;
result = result - min(minH, height[end]);
}
if (height[start]>minH && height[end]>minH){
result += min(height[start] - minH, height[end] - minH) * (end - start - 1); //加上超出的部分
minH = min(height[start], height[end]);
}
}
return result;
}
};2、网上另外一个比较好的办法是左右两边扫的办法。记录每个数左边和右边最大的数。左边最大与右边最大构成一个容器,减去本身的空间,这相当于这个位置上的台阶贡献了容量。
class Solution {
public:
int trap(vector<int>& height) {
int len = height.size();
if (len<3){
return 0;
}
int maxL[len], maxR[len];
int maxH = height[0];
maxL[0] = 0;
for(int i=1; i<len; i++){
maxL[i] = maxH;
maxH = max(maxH, height[i]);
}
maxH = height[len-1];
maxR[len-1]=0;
int result=0;
for(int i=len-2; i>=0; i--){
maxR[i]=maxH;
maxH = max(maxH, height[i]);
result +=max(0, min(maxL[i], maxR[i]) - height[i]);
}
return result;
}
};
相关文章推荐
- [LeetCode] Trapping Rain Water II 题解
- LeetCode (42): Trapping Rain Water
- 【LeetCode】Trapping Rain Water
- [Leetcode] Trapping Rain Water
- LeetCode : Trapping Rain Water (java)
- LeetCode Trapping Rain Water
- LeetCode42 Trapping Rain Water
- LeetCode--Trapping Rain Water(捕获雨水)Python
- [LeetCode]042-Trapping Rain Water
- [leetcode]Trapping Rain Water @ Python
- LeetCode(42)Trapping Rain Water
- Leetcode trapping rain water 容器装水问题
- [Leetcode 42] Trapping Rain Water
- Leetcode Trapping Rain Water
- LeetCode: Trapping Rain Water
- Trapping Rain Water_Leetcode_#42
- LeetCode_42---Trapping Rain Water
- LeetCode 42 Trapping Rain Water(积水体积)
- LeetCode(42)Trapping Rain Water
- leetcode-Trapping Rain Water (2014.3.10)