top面试42.接雨水

题目描述:

思路1:从0到size遍历一遍数组,对于位置i处的雨水量为i左边的最大值(包括点i处)和i右边的最大值(包括点i处)二者的最小值减去i的高度。

class Solution {
public:
    int trap(vector<int>& height) {
        int res=0;
        for(int i=1;i<height.size();i++){
            int max_left=0,max_right=0;
            //左边的最大值
            for(int j=i;j>=0;j--){
                max_left=max(max_left,height[j]);
            }
            //右边的最大值
            for(int j=i;j<height.size();j++){
                max_right=max(max_right,height[j]);
            }
            //位置i处的雨水量
            res+=min(max_left,max_right)-height[i];
        }
        return res;
    }
};

 思路2:首先将位置i左端的最大值存入到left_max容器中,将位置i右端的最大值存入到right_max容器中,然后遍历即可。

class Solution {
public:
    int trap(vector<int>& height){
        int res=0;
        int size=height.size();
        if(size==0) return 0;
        //存储i左边和右边最大值的数组初始化
        vector<int>left_max(size),right_max(size);
        left_max[0]=height[0];
        for(int i=1;i<size;i++){
            left_max[i]=max(left_max[i-1],height[i]);
        }
        right_max[size-1]=height[size-1];
        for(int i=size-2;i>=0;i--){
            right_max[i]=max(right_max[i+1],height[i]);
        }
        for(int i=0;i<height.size();i++){
            res+=min(left_max[i],right_max[i])-height[i];
        }
        return res;
    }
};

思路3:双指针

class Solution {
public:
    int trap(vector<int>& height){
        int res=0;
        int size=height.size();
        int left=0,right=size-1;
        int left_max=0,right_max=0;
        while(left<right){
            //始终对较小的一端进行操作
            if(height[left]<height[right]){
                //只有当前位置的高度小于当前最大值时,计算雨水面积,否则只更新最大值
                height[left]>=left_max?(left_max=height[left]):res+=(left_max-height[left]);
                //更新指针
                left++;
            }else{
                height[right]>=right_max?(right_max=height[right]):res+=(right_max-height[right]);
                right--;
            }
        }
        return res;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值