42. 接雨水

PAT刷了就剩几题了,开始发一点力扣的解题记录。

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
42. 接雨水_第1张图片
之前好像看到字节面试题有这道

最开始是想,每次都关注最底下那一行,计算完一行的雨水数后将这一行高度降低1,直到所有高度都为0或只有一个高度不为0。显然当高度很大时容易超时,用例最后一个不通过。

int trap(vector<int>& height) {
    int res=0,len=height.size();
    while(1){
        int s=0,e=len-1;
        while(s!=len&&height[s]==0)s++;//find first non-zero num
        while(e>=s&&height[e]==0)e--;//find last none-zero num
        if(e==s||s==len)break;
        for(int i=s;i<=e;i++){
            if(height[i]>0) height[i]--;
            else res++;
        }
    }
    return res;
}

雨水的高度总是和它相邻的最低高度相等。相邻最低高度需要判断两侧。如果从左边开始扫描最高值,那么
42. 接雨水_第2张图片
再从右边开始扫描最高值,同一位置上较小的最高值即为该区间的相邻最低高度。减去原本高度累加得到结果。

class Solution {
public:
    int trap(vector<int>& height) {
        int res=0,len=height.size();
        if(len==0)return 0;
        vector<int> leftmax(len),rightmax(len);
        leftmax[0]=height[0],rightmax[len-1]=height[len-1];
        for(int i=1;i<len;i++)leftmax[i]=max(leftmax[i-1],height[i]);
        for(int i=len-2;i>=0;i--)rightmax[i]=max(rightmax[i+1],height[i]);
        for(int i=0;i<len;i++)res+=(min(rightmax[i],leftmax[i])-height[i]);
        return res;
    }
};

42. 接雨水_第3张图片

你可能感兴趣的:(LEETCODE)