描述
给出 n 个非负整数,代表一张X轴上每个区域宽度为 1
的海拔图, 计算这个海拔图最多能接住多少(面积)雨水。
微信加 jiuzhang15 发送验证信息【国内大厂】领字节、阿里、百度等最新高频题
样例
样例 1:
输入: [0,1,0]
输出: 0
样例 2:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
挑战
O(n) 时间, O(1) 空间
O(n) 时间, O(n) 空间也可以接受
int trapRainWater(vector<int> &heights)
{
if (heights.size() < 2)
{
return 0;
}
int sum = 0;
int leftCurMax = 0;
vector<int> rightMaxVec(heights.size(),-1);
int left = 0;
leftCurMax = max(leftCurMax, heights[left]);
int rightMax = 0;
for (int right = heights.size() - 1; right >= 2; right--)
{
rightMaxVec[right] = max(rightMax, heights[right]);
rightMax = rightMaxVec[right];
}
sum += max(0, min(leftCurMax, rightMax) - heights[1]);
for (int index = 2; index < heights.size()-1; index++)
{
leftCurMax = max(leftCurMax, heights[index-1]);
int rightMax = rightMaxVec[index+1];
sum += max(0,min(leftCurMax, rightMax) - heights[index]);
}
return sum;
}
第二种方法
int trap(vector<int>& height)
{
int ret = 0;
vector<int> upVec(height.size(), 0);
vector<int> downVec(height.size(), 0);
左边最大
upVec[0] = height[0];
for (int i = 1; i < height.size(); i++)
{
upVec[i] = upVec[i - 1]> height[i] ? upVec[i - 1] : height[i];
}
右边最大
downVec[height.size() - 1] = height[height.size() - 1];
for (int i = height.size() - 2; i >=0; i--)
{
downVec[i] = downVec[i +1] >height[i] ? downVec[i + 1] : height[i];
}
取两边最小
for (int i = 0; i < height.size(); i++)
{
int tmp = upVec[i] > downVec[i] ? downVec[i] : upVec[i];
ret += tmp - height[i];
}
return ret;
}