一、题目叙述:
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!
Subscribe to see which companies asked this question.
二、解题思路:
本题是参考别人的代码而来的,解题思路主要如下,针对坐标系每个位置求能容纳的雨水的量:每个位置所能容纳的雨水的量为其位置左边最大值与右边最大值两者中较小者减去此位置的值;
(1)分别计算每个位置左右边的最大值,放在数组left、right中;
(2)对每个位置计算容雨量,加起来
(3)注意输入非空的情况;
三、源码:
public class Solution
{
public int trap(int[] height)
{
if(height.length == 0) return 0;
int maxLeft = 0;
int maxRight = 0;
int sum = 0;
int len = height.length;
int[] left = new int[len];
int[] right = new int[len];
for (int i = 0; i < len; i++)
{
left[i] = maxLeft;
maxLeft = Math.max(maxLeft, height[i]);
}
for (int i = len - 1; i >= 0; i--)
{
right[i] = maxRight;
maxRight = Math.max(maxRight, height[i]);
}
for (int i = 0; i < len; i++)
{
if (Math.min(left[i], right[i]) - height[i] > 0)
sum += Math.min(left[i], right[i]) - height[i];
}
return sum;
}
public static void main(String args[])
{
// int[] digits = {0};
Solution solution = new Solution();
int[] abc = {0,1,0,2,1,0,1,3,2,1,2,1};
// for(int i = 0; i < abc.length; i ++)
System.out.print(solution.trap(abc));
}
}