42. 接雨水
题目链接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目描述
题目分析
参考链接:
https://github.com/youngyangyang04/leetcode-master/blob/master/problems/0042.接雨水.md
- 双指针法
时间复杂度o(n2),空间复杂度o(1)
按列求接水量,for循环的i代表第i颗柱子接水的量。求出每一列接水量,再相加。
rHeight 求右侧height最大的
lHeight求左侧height最大的
找左右柱子最高的时候要跟rHeight或者lHeight比较,它们的值是动态变化的。
力扣上超出时间限制
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
int sum = 0;
for(int i = 0; i < n; i++){
if(i == 0 || i == n - 1) continue;
int lHeight = height[i];
int rHeight = height[i];//记录右侧最高值
// 找左侧柱子最高
for(int l = i - 1; l >= 0; l--){
if(height[l] > lHeight) lHeight = height[l];
}
// 找右侧柱子最高
for(int r = i + 1; r < n; r++){
if(height[r] > rHeight) rHeight = height[r];
}
int h = min(lHeight, rHeight) - height[i];
sum += h;
}
return sum;
}
};
- 动态规划
先分别计算出左边最高的柱子以及右边最高的柱子
注意:求每根柱子右边最大高度,i–!!!!
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
if(n < 2) return 0;
int sum = 0;
vector<int> maxLeft(n, 0);
vector<int> maxRight(n, 0);
maxLeft[0] = height[0];
for(int i = 0; i < n; i++){ // 记录每根柱子左边最大高度
if(i == 0) continue;
maxLeft[i] = max(height[i], maxLeft[i - 1]);
}
maxRight[n - 1] = height[n - 1];
for(int i = n - 1; i >= 0; i--){ // 记录每根柱子右边最大高度
if(i == n - 1) continue;
maxRight[i] = max(height[i], maxRight[i + 1]);
}
for(int i = 0; i < n; i++){
int h = min(maxLeft[i],maxRight[i]) - height[i];
sum += h;
}
return sum;
}
};
- 单调栈
暂无