题目:给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
动态规划
思路:找出某个柱子接雨水的左边的最大值iLeft和右边的最大值iRight
定义两个数组leftMax和rightMax,从左往右地遍历arr数组,找到每个arr[ i ]左边的最大值存入leftMax;再从右往左地遍历arr数组,找到每个arr[ i ]右边的最大值存入rightMax。最后再次遍历arr数组计算每个arr[ i ]的接水量,累加起来就是最终结果ret。
class Solution {
public int trap(int[] arr) {
// 找出每个arr[i]左边的最大值(包含它自己)
int[] leftMax = new int[ arr.length ];
leftMax[0] = arr[0];
for ( int i=1; i<arr.length; i++ )
leftMax[i] = Math.max( leftMax[i-1], arr[i] );
// 找出每个arr[i]右边的最大值(包含它自己)
int[] rightMax = new int[arr.length];
rightMax[arr.length-1] = arr[arr.length-1];
for ( int i=arr.length-2; i>=0; i-- )
rightMax[i] = Math.max( rightMax[i+1], arr[i] );
// 用max( iLeft, iRight) - arr[i]求出每个arr[i]的最大接水量
int ret = 0;
for ( int i=0; i<arr.length; i++ )
ret += Math.min( leftMax[i], rightMax[i] ) - arr[i];
return ret;
}
}