题目大意:
一个数组表示各个点的高度,问能存储多少水。
思路:
- 暴力 :对每个点求出它左面和右面的最大值,就可以求出当前点能存储的单元。
时间复杂度:O(n^2)
空间复杂度:O (1) - 动态规划:先用动态规划求出每个点从左到当前点最大值,和从当前点到最后的最大值。
时间复杂度:O(n)
空间复杂度:O(n) - 双指针:
时间复杂度 O(1)
空间复杂度 O(1)
代码:
思路一:
class Solution {
public:
int trap(vector<int>& height) {
if (height.empty()) return 0;
int res = 0;
for (int i=1; i<height.size()-1; ++i) {
int l = *max_element(height.begin(), height.begin()+i+1);
int r = *max_element(height.begin()+i, height.end());
res += min(l, r) - height[i];
}
return res;
}
};
思路二:
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
vector<int> l(n, 0);
vector<int> r(n, 0);
int max_l = 0;
for (int i=0; i<n; ++i) {
max_l = max(height[i], max_l);
l[i] = max_l;
}
int max_r = 0;
for (int i=n-1; i>=0; --i) {
max_r = max(height[i], max_r);
r[i] = max_r;
}
int res = 0;
for (int i=0; i<n; ++i) {
res += min(r[i], l[i]) - height[i];
}
return res;
}
};
思路三:
class Solution {
public:
int trap(vector<int>& height) {
if (height.empty()) return 0;
int n = height.size();
int l = 0, r = n-1;
int max_l = 0, max_r = 0;
int res = 0;
while (l <= r) {
if (max_l < max_r) {
max_l = max(height[l], max_l);
res += max(min(max_l, max_r) - height[l++], 0);
}else {
max_r = max(height[r], max_r);
res += max(min(max_l, max_r) - height[r--], 0);
}
}
return res;
}
};
第二次写这个题了。。。