leetcode42: Trapping Rain Water

博客围绕计算山峰间雨水存储量的问题展开。给定代表山峰高度的数组,要计算下雨后能存储的雨水量。解法是先找到最高峰,在其左边从左往右搜索,前峰比后峰高时记录蓄水量;右边从右往左计算,给出了O(n)的解法。

题目:

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.


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!

Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6

 

题目的意思大概是:这个数组是描绘一座山上每个山峰的高度,当下雨时,山峰之间会存储雨水,计算雨水的量。

 

解法:

我们首先找到最高的山峰,在最高峰的左边,从左往右搜索,当前一座峰比后一座峰高时,记录蓄水量(因为之后至少肯定有最高峰将水蓄住);而对于最高峰的右侧,采用从右想做的方法,计算蓄水量。

代码:

class Solution {
    public int trap(int[] height) {
	       int pre, rs = 0, Top = 0, length = height.length, index;
           // find the summit.
	       for(index = 1; index<length; index++) {
		     if(height[index]>=height[Top]) Top = index;
	     }	
	       // process the left side.
	       for(pre = index = 0; index<Top; index++) {
		     if(height[index]<pre) rs += (pre-height[index]);
		    else pre = height[index];
	      }
	       // process the right side.
	      for(pre = 0, index = length-1; index>Top; index--) {
		     if(height[index]<pre) rs += (pre-height[index]);
		        else pre = height[index];
	       }
	        return rs;
        }
}

这是一个O(n)的解法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值