题目描述:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

思路解析:
很多同学在一做题的时候总觉得思路不知从何而来。好像除了暴力怎么想也没思路。
我觉得正确的方法是先用暴力,然后看暴力思路中有什么可以优化的点,比如空间换时间,重复没必要遍历优化等等。而不是一下子灵光一现直接想出最佳思路。
我们先想一想,我们如果挨个柱子遍历,确定一个柱子最多能接多少水,其实取决于这根柱子左边的最高柱子和右边的最高柱子。他们中最矮的柱子减去自身的高度,就是能盛水最多的值。
如果暴力遍历,也就是遍历数组,左边右边分别找最高的,然后计算。那么遍历两次,时间复杂度就是O(n^2)这是不行的,太慢了。
如果我们可以在每次遍历就直接知道左边最高和右边最高是不是就可以压缩到O(n)了
那么我们用数组记录不就好了。
用两个数组分别记录左边右边,这思路是一个左右拆分思想。如果当前数组的值和左侧右侧都有关系,那么就用两个数组来记录。
那么找到左右最高的时间就是O(1)
思路简单清晰
代码实现:
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
vector<int> leftHighest (n);
vector<int> rightHighest (n);
int ans = 0;
int leftMax = 0;
for (int i = 0;i < n;i++) {
leftMax = max(leftMax, height[i]);
leftHighest[i] = leftMax;
}
int rightMax = 0;
for (int i = n - 1;i >=0;i--) {
rightMax = max(rightMax, height[i]);
rightHighest[i] = rightMax;
}
for (int i = 0;i < n;i++) {
ans += min(leftHighest[i], rightHighest[i]) - height[i];
}
return ans;
}
};
4715

被折叠的 条评论
为什么被折叠?



