/**
* Index: 42
* Title: Trapping Rain Water
* Author: ltree98
**/
题意:
求n个柱子的储水体积。
给的n个正数代表每个柱子的高度。
思路:
从第一个柱子开始,
找到下一个高度大于等于该柱子高度的柱子,然后求这两根柱子间的储水体积;
再以该柱子为基准,继续向后找大于等于该柱子高度的柱子。
经过一轮遍历,找到了最高柱子;
再从后往前(到最高柱子为止)用上面的逻辑遍历一遍。
时间复杂度:O(n + n) = O(n)
空间复杂度:O(1)
实现:
class Solution {
public:
int trap(vector<int>& height) {
int sum = 0;
stack<int> temp;
int front = 0;
temp.push(front);
for(int i = front; i < height.size(); i++) {
if(height[temp.top()] <= height[i]) {
for(int k = temp.top() + 1; k < i; k++) {
sum += (height[temp.top()] - height[k]);
}
temp.pop();
temp.push(i);
}
}
front = temp.top();
temp.pop();
temp.push(height.size()-1);
for(int i = height.size()-2; i >= front; i--) {
if(height[temp.top()] <= height[i]) {
for(int k = temp.top() - 1; k > i; k--) {
sum += (height[temp.top()] - height[k]);
}
temp.pop();
temp.push(i);
}
}
return sum;
}
};
进阶:
看了下评论区大神代码,第一位是7行C++/C
思路:
从两边向中间收缩,根据目前为止最低柱子的高度与两侧中最低柱子的高度差进行储水量的计算。
时间复杂度: O(n/2) = O(n)
空间复杂度: O(1)
实现:
class Solution {
public:
int trap(vector<int>& height) {
int l = 0, r = height.size()-1, level = 0, water = 0;
while (l < r) {
int lower = height[height[l] < height[r] ? l++ : r--];
level = max(level, lower);
water += level - lower;
}
return water;
}
};