code 1
- 思路,一个一个看。i位置的值,就是i左右两侧最小值减去height[i]。把这些都算出来加起来即可
- 备忘录
- l_max[i] i左边最大的墙壁
- r_max[i] i右边最大的墙壁
- 时间复杂度
O
(
N
)
O(N)
O(N)
- 空间复杂度
O
(
N
)
O(N)
O(N)
class Solution {
public:
int trap(vector<int>& height) {
int len = height.size();
if(len==0) return 0;
vector<int> l_max(len, 0), r_max(len, 0);
l_max[0] = height[0];
for(int i=1; i<len; i++)
l_max[i] = max(height[i], l_max[i-1]);
r_max[len-1] = height[len-1];
for(int i=len-2; i>=0; i--)
r_max[i] = max(height[i], r_max[i+1]);
int sum=0;
for(int i=0; i<len; i++){
sum+=min(l_max[i], r_max[i]) - height[i];
}
return sum;
}
};
code 2
- 去掉了备忘录,节省空间
- 时间复杂度
O
(
N
)
O(N)
O(N)
- 空间复杂度
O
(
1
)
O(1)
O(1)
class Solution {
public:
int trap(vector<int>& height) {
int len = height.size();
if(len==0) return 0;
int l = 0 , r = len - 1;
int l_max = height[0], r_max=height[len-1];
int sum=0;
while(l<=r){
l_max = max(l_max, height[l]);
r_max = max(r_max, height[r]);
if(l_max<=r_max){
sum+=l_max-height[l];
l++;
}
else{
sum+=r_max-height[r];
r--;
}
}
return sum;
}
};