leetcode42. 接雨水

一:题目

在这里插入图片描述

二:上码

// 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;
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值