接雨水(双指针)

本文介绍了解决LeetCode中关于柱子高度图的问题,计算在给定高度图中,每列柱子能接取的雨水量,利用左侧最大高度和右侧最大高度的概念,通过遍历计算得出答案。
摘要由CSDN通过智能技术生成

11. 盛最多水的容器 - 力扣(LeetCode)

题目描述

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

样例输入

示例 1:

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

提示:

  • n == height.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

题解

思路:对于每一列的柱子,所能容纳的雨水是其左侧最大高度和右侧最大高度的最小值与本身高度的差值,即min{左侧最大高度的柱子,右侧最大高度的柱子}-自身高度

因此,我们需要计算每一列柱子的左侧最大高度的柱子,与右侧最大高度的柱子。

故使用另个数组lh和rh对height进行一次遍历,并分别保存每一列左右两侧最大高度柱子的值

class Solution {
public:
    int trap(vector<int>& height) {
        if(height.size()<=2) return 0;
        vector<int> lh(height.size(),0);
        vector<int> rh(height.size(),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 i=height.size()-2;i>=0;i--)
        {
            rh[i]=max(height[i],rh[i+1]);
        }

        int sum=0;
        //由于两端的柱子不能接雨水,因此i的取值为[1,height.size()-2]
        for(int i=1;i<height.size()-1;i++)
        {
            sum+=(min(lh[i],rh[i]))-height[i];
        }
        return sum;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值