[leetcode]Trapping Rain Water

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;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值