一:题目
二:上码
// class Solution {
// public:
// /**
===========================超时===================
// 思路:
// 1.我们按列来计算 这就是表明的是 我们求取接雨水 向上的高度就是雨水量
// 但是这里的话我们的需要对雨水的高度 来进行判定
// 2.那么如何判定我们所接雨水的高度呢?
// 雨水height = min(该列左侧高度最高的列,该列右侧高度最高的列) - 该列的高度
// 3.那么接下来就是 挨个遍历每列 但是我们的首列和最后一列是不用遍历的 因为他们都接不到雨水
// */
// int trap(vector<int>& height) {
// int ans = 0;
// for (int i = 0; i < height.size(); i++) {
// //这是首行和最后一行接不到雨水
// if (i == 0 || i == height.size()-1) continue;
// int lh = height[i];
// int rh = height[i];
// //求右侧最高高度
// for (int k1 = i+1; k1 < height.size(); i++) {
// rh = max(rh,height[k1]);
// }
// //求取左侧最高高度
// for (int k2 = i-1; k2 >= 0; k2++) {
// lh = max(lh,height[k2]);
// }
// int nums = abs(rh-lh) - height[i];
// if (nums > 0) ans += nums;//这里求出的nums有可能是负数 比如他 本列他就是最高的话
// }
// return ans;
// }
// };
class Solution {
public:
/**
思路:
1.我们按列来计算 这就是表明的是 我们求取接雨水 向上的高度就是雨水量
但是这里的话我们的需要对雨水的高度 来进行判定
2.那么如何判定我们所接雨水的高度呢?
雨水height = min(该列左侧高度最高的列,该列右侧高度最高的列) - 该列的高度
3.那么接下来就是 挨个遍历每列 但是我们的首列和最后一列是不用遍历的 因为他们都接不到雨水
4.对其进行优化 只要我们求出每列的左侧最大值和右侧最大值 我们再求出两侧中最低的-该列高度
我们就可以救出最终的结果
那么好 我们可以设置两个数组,一个数组记录每列左侧的最大值,一个数组记录右侧的最大值
*/
int trap(vector<int>& height) {
if(height.size() <= 2) return 0;
vector<int> lh(height.size(),0);
vector<int> rh(height.size(),0);
int sum = 0;
lh[0] = height[0];
for (int i = 1; i < height.size(); i++) {
lh[i] = max(height[i],lh[i-1]);//求取该列左侧的最大值
}
rh[height.size()-1] = height[height.size()-1];
for (int j = height.size()-2; j >= 0; j--) {
rh[j] = max(height[j],rh[j+1]);//这个是求取我们右侧的最大值
}
for (int i = 0; i < height.size(); i++) {
int nums = min(rh[i],lh[i]) - height[i];//
if (nums > 0) sum += nums;
}
return sum;
}
};