一:题目
二:上码
// 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;}
};