LeetCode42——Trapping Rain Water

LeetCode42——Trapping Rain Water

题意:

看图就很明显。

但是做起来就没想象的简单了。。。

我最初的疑惑:

如果序列是这种情况01010,也就是说“凹点”两边都是“凸点”这样就简单了,直接根据短板原理可求,遍历求出索引为i-1和i+1的value的最小值即可。。。

但是如果遇到这种情况21012,也就是中间0的凹点,两边的壁呈递增,就懵逼了。。。


想了很久,口述还是不清楚,画个图吧:



图就一目了然了,事实上,我们把索引2处的水注与索引1,3的水分开成单独的水柱(虽然物理上不可能),那么在求解的时候,分别算出索引2处左右的最长的“隔板”(这里可以是隔空的),再求出这两者的最小值,减去索引2处的高度(此处为0),就是索引2处矩形水柱的高度了。

代码:

class Solution {
public:
	int trap(vector<int>& height) {
		int curMax = 0;
		int len = height.size();
		vector<int>leftMax(len);
		vector<int>rightMax(len);
		for (int i = 0; i < len; i++)
		{
			leftMax[i] = curMax;//左边最大值
			curMax = max(curMax, height[i]);//当前最大值
		}
		curMax = 0;
		for (int i = len - 1; i >= 0; i--)
		{
			rightMax[i] = curMax;
			curMax = max(curMax,height[i]);
		}
		int sum=0;
		for (int i = 0; i < len; i++)
		{
			if (leftMax[i] != 0 && rightMax[i] != 0)
			{
				int temp = min(leftMax[i], rightMax[i]) - height[i];
			
				if (temp > 0)
					sum += temp;
			
			}
		}
		//debuging
		//while (1)
		//{
		//	int a;
		//	int b;
		//}
		return sum;
	}
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值