您的位置:首页 > 移动开发

[leetcode]Trapping Rain Water

2017-04-09 15:54 387 查看
Trapping Rain Water

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.

difficulty:hard

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!

题目写的很清楚,图也很直观,就是计算这些树状图在下雨的时候能存多少雨水。

我用的方法是从左到右遍历每个数,找到每个坑并计算存水的数量。当数是降序的时候,说明是坑的左边,数是升序的时候就是坑的右边。遍历的时候如果遇到坑左就记录一下位置,如果遇到坑右就开始计算能存的水,并把已经计算过的坑填上,最后重新记录可以作为坑左的位置。

int trap(vector<int>& height) {
vector<int> left;
int result = 0;
int i;
for (i=0; i< height.size(); i++){//找到第一个不为0的数
if (height[i] > 0)
break;
}
left.push_back(i);//记录不为0的位置
i++;
for (; i < height.size(); i++){//开始遍历

if (height[i]>height[i - 1]){//升序情况
int max = left[left.size() - 1];

for (int j = left.size() - 1; j >= 0; j--){
if (i - j > 1){//坑左与坑右距离要大于1
if (height[left[j]] >= height[i]){//往前找到高度大于等于当前坑右的坑左

for (int k = left[j] + 1; k < i; k++){//记录坑并填坑
result += height[i] - height[k];
height[k] = height[i];
}

left.push_back(i);//当前坑右往后当做坑左来计算
break;
}
}
if (height[left[j]] > height[max])//记录坑右中最高的
max = left[j];

}

if (height[max] < height[i]){//前面没找到比当前坑右高的坑左,则用坑左里最高的那个
if (i - max>1){//坑左与坑右距离要大于1
for (int k = max + 1; k < i; k++){//记录坑并填坑
result += height[max] - height[k];
height[k] = height[max];
}
left.push_back(i);//当前坑右往后当做坑左来计算
}
else{
left.push_back(i);//当前坑右往后当做坑左来计算
}

}

}
else{//降序或者不变则记录为坑左
left.push_back(i);

}
}
return result;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: