Leecode——第42题接雨水

这个题目和上面盛水最多的容器一样,那个题目是用双指针,左右比较,如果左边小就移动左边,如果右边小就移动右边


暴力法:
这个题目是接雨水,可以从第一个到最后一个遍历,对于每个数。分别往左往右找到最大的值,然后取最大值的最小值减去该值就是这个位置的水量

class Solution {
public:
    int trap(vector<int>& height) {
        int ans=0;
        for(int i=0;i<height.size()-1;i++){
            int max_l=0,max_r=0;
            for(int j=i;j>=0;j--){//往左边找最大值
                max_l=max(height[j],max_l);
            }
            for(int j=i;j<height.size();j++){//往右找最大值
                max_r=max(height[j],max_r);
            }
            ans=ans+min(max_r,max_l)-height[i];
        }
        return ans;
    }
};

还可以用动态规划来做,分别创建两个数组,记录每个位置,从左边的最大值(1-n-1),从右边的最大值(0-n-2)

        //使用动态规划,创建左右两个数组
        int n=height.size();
        vector<int> left(n);//创建数组
        vector<int> right(n);
        
        left[0]=height[0];
        for(int i=1;i<n;i++){
            left[i]=max(left[i-1],height[i]);//i处左边最大值是前面最大值和自己比较的最大值
        }

        right[n-1]=height[n-1];
        for(int i=n-2;i>=0;i--){
            right[i]=max(right[i+1],height[i]);//i处右边最大值是他右边那个位置右边最大值和自己的比
        }

        int res=0;
        for(int i=0;i<n;i++){
            res=res+min(left[i],right[i])-height[i];
        }
        return res;

用双指针,需要左右指针和左右的最大值四个变量,如果左边的值小于右边的值,对应的左边的最大化值肯定小于右边的最大值,所以左边计算水量,左边++

        //用双指针的方法
        int l=0,r=height.size()-1;
        int lmax=0,rmax=0;
        int res=0;
        while(l<r){
            lmax=max(height[l],lmax);
            rmax=max(height[r],rmax);
            if(height[l]<=height[r]){
                res=res+lmax-height[l];
                l++;
            }
            else{
                res=res+rmax-height[r];
                r--;
            }
        }
        return res;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值