363.Trapping Rain Water-接雨水(中等题)

本文介绍了一个经典的算法问题——接雨水,通过给定的一系列非负整数代表的海拔图,计算能够接住的最大雨水量。文章提供了一种利用双指针技术的高效解决方案,详细解释了其实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接雨水

  1. 题目

    给出 n 个非负整数,代表一张X轴上每个区域宽度为 1 的海拔图, 计算这个海拔图最多能接住多少(面积)雨水。
    这里写图片描述

  2. 样例

    如上图所示,海拔分别为 [0,1,0,2,1,0,1,3,2,1,2,1], 返回 6.

  3. 挑战

    O(n) 时间, O(1) 空间
    O(n) 时间, O(n) 空间也可以接受

  4. 题解

    能接雨水的多少直接取决于左右端点的高度较小的那一个,使用双指针分别指向首末元素,每次选择高度小的指针向另一个指针移动,并和原来位置的高度进行比较,如果大于原指针位置元素高度则记录新的高度,反之将高度差作为雨水值保留,直至两指针相遇。

public class Solution {
    /**
     * @param heights: an array of integers
     * @return: a integer
     */
    public int trapRainWater(int[] heights) {
        int result = 0;
        int left = 0;
        int right = heights.length-1;
        if (left >= right)
        {
            return result;
        }
        int leftHeight = heights[left];
        int rightHeight = heights[right];
        while (left < right)
        {
            if (heights[left] < heights[right])
            {
                left++;
                if (leftHeight > heights[left])
                {
                    result += (leftHeight - heights[left]);
                }
                else
                {
                    leftHeight = heights[left];
                }
            }
            else
            {
                right--;
                if (rightHeight > heights[right])
                {
                    result += (rightHeight - heights[right]);
                }
                else
                {
                    rightHeight = heights[right];
                }
            }
        }

        return result;
    }
}

Last Update 2016.11.8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值