42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

img

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。

解法一:Brute-Force, TLE

寻找左边最大值和右边最大值,取其小

class Solution {
public:
    int trap(vector<int>& height) {
        int n=height.size(),ans=0;
        auto startit=cbegin(height), endit=cend(height);
        for(int i=0;i<n;i++){
            int l=*max_element(startit,startit+i+1);
            int r=*max_element(startit+i, endit);
            ans+=min(l,r)-height[i];
        }
        return ans;
    }
};

解法二 动态规划

避免解法一的多次运算左边最大和右边最大值

class Solution {
public:
    int trap(vector<int>& height) {
        int n=height.size(),ans=0;
        vector<int> leftMax(height.size(),0),rightMax(height.size(),0);
        for(int i=0;i<n;i++){
            leftMax[i]=i==0?height[i]:max(leftMax[i-1],height[i]);
        }
        for(int i=n-1;i>=0;i--){
            rightMax[i]=i==n-1?height[i]:max(rightMax[i+1],height[i]);
        }
        for(int i=0;i<n;i++){
            ans+=min(leftMax[i],rightMax[i])-height[i];
        }
        return ans;
    }
};

解法三 双指针

原理同解法二,但因为从左至右和从右至左都是单调递增趋势(要找最大),所以可以使用双指针去解。

class Solution {
public:
    int trap(vector<int>& height) {
        int n=height.size();
        if(n==0) return 0;
        int l=0,r=n-1,max_l=height[l],max_r=height[r],ans=0;
        while(l<r){
            if(max_l<max_r){
                ans+=max_l-height[l];
                max_l=max(max_l,height[++l]);
            }else{
                ans+=max_r-height[r];
                max_r=max(max_r,height[--r]);
            }
        }
        return ans;
    }
};
全部评论

相关推荐

把实习生当正职使昨天第一天就加班,晚上连口饭都没吃上,以后日子咋过,我不想干了
码农索隆:实习不怕忙,就怕干的活重复且没难度,要干就干那种有深度有难度的任务,这样才能快速的提升
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
水墨不写bug:疑似没有上过大学
点赞 评论 收藏
分享
06-25 21:00
门头沟学院 Java
多拆解背记一下当前的高频场景面试题,结合自己的项目经历去作答,面试通过率原来真的不会低!
牛客965593684号:小公司不就是这样的吗,面试要么是点击就送,要么就是往死里拷打,没有一个统一的标准。这个不能代表所有公司
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务