LeetCode: Trapping Rain Water [041]
【题目】
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.
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!
【题意】
给定一个数组,数组中每一个索引位表示一个bar, 对应索引位的值表示bar的高度,bar的宽度为1。计算这个bar组能盛多少水。
【思路】
如图所示,次高和最高之间可以构成盛水区域。因此我们的目的就是找到所有这样的凹槽区域;
以A[0]为凹槽的左边界,我们需要向后扫描找到第一个不低于A[0]的bar, 假设即为A[k], 那么A[0]和A[k]之间就构成了一个凹槽;
然后以A[k]为新凹槽的左边界,向后扫描找到第一个不低于A[k]的bar, 假设即为A[m], 那么A[k]和A[m]之间就构成了一个凹槽;
依次向后类推。
【代码】
class Solution { public: int trap(int A[], int n) { if(n<3)return 0; int result=0; int left=0; int right=0; int maxHeight=0; //用来保存左边界左边的最大高度 int maxIndex=-1; //用来保存左边界左边最大高度对应的索引位置 while(left<n-1){ right=left+1; maxHeight=0; while(right<n && A[right]<A[left]){ if(A[right]>=maxHeight){ maxHeight=A[right]; maxIndex=right; } right++; } if(right>=n){ //如果没有找到不低于左边界的右边界,则取次高bar计算 right=maxIndex; } //计算当前凹槽的储水量 int height=min(A[left], A[right]); //获得储水高度 for(int i=left+1; i<right; i++){ result+=height-A[i]; } left=right; } return result; } };
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。