leetcode42.接雨水

参考:
https://blog.youkuaiyun.com/qq_26410101/article/details/81784803

1.两次遍历数组,依次记录每个位置左边和右边的最大值left[i]right[i],其中
left[i]表示i位置左边的最大高度
right[i]表示i位置右边的最大高度
那么只有当left[i]right[i]都大于i位置的高度时,在i位置上才会有积水(积水指当前位置之上有水,这种方法是计算每个位置上的雨水量之和得到结果的)。
积水量是min(left[i],right[i])-height[i] 其中height[i]表示i位置的高度

class Solution {
public:
    int trap(vector<int>& height) {
	vector<int> left(height.size(), INT_MIN);
	vector<int> right(height.size(), INT_MIN);
	int left_max = INT_MIN;
	int right_max = INT_MIN;
	int res = 0;
	for (int i = 0; i < height.size(); i++) {
		left[i] = max(left_max, (i>0?left[i-1]:0)); //注意left[0]取0
		left_max = max(left_max, height[i]);
	}
	for (int i = height.size()-1; i >=0; i--) {
		right[i] = max(right_max, (i<(height.size() - 1) ? right[i + 1] : 0));
		right_max = max(right_max, height[i]);
		int mm = min(left[i], right[i]);
		res = res + (mm > height[i] ? mm-height[i]: 0); //将求right数组和计算最终结果放在一块可以少一次遍历
	}
	return res;    
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值