题目:
已解答
困难
相关标签
相关企业
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5] 输出:9
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
-
思路
对于这道题,其实可以找到最高的地方,分别从最左边和最右边遍历,具体思路见代码解题方法
可以对着官方的图理解复杂度
O(n∗m)O(n*m)O(n∗m)Code
C++
class Solution
{
public:
int trap(vector<int> &height)
{
int l = height.size() - 1;
int temp = 0, ans = 0, ans1 = 0;
for (int i = 0; i < l; i++)
{
if (height[i] > 0)//大于0说明有墙;
{
for (int j = i + 1; j <= l; j++)
{if (height[j] >= height[i])//说明可以围成坑
{
ans += temp;//把值赋给答案
temp = 0;
i = j;//$O(n*m)$的源泉
}
else
temp += height[i] - height[j];//最多有多少水(不一定赋值给ans)
if (j == l)//说明找到最高的墙了,于是反着来一次
{ temp=0;
for (int k = l; k > i; k--)
{
if (height[k] > 0)
{
for (int m = k - 1; m >= i; m--)
{
if (height[m] >= height[k])
{
ans += temp;
temp = 0;
k = m;
}
else
temp += height[k] - height[m];
}
}
}
return ans;
}
}
temp = 0;
}
}
return ans;
}
};看到4个for循环是不是以为过不了,其实仔细看复杂度才O(n*m)hhh。