70.Trapping Rain Water(容水量)

本文介绍了一种计算二维数组表示的地形中雨水积存量的高效算法。通过使用双指针技术,从数组的两端开始向中间扫描,比较两端的高度,选择较低的一侧进行遍历。当遇到更低的地形时,计算并累加积水体积。此算法适用于解决LeetCode第42题,即求解雨后地形中的积水问题。
Level:

  Hard

题目描述:

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

img
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6
思路分析:

  设置两个指针left和right,分别指向数组的首尾位置,然后从两边向中间扫描,在当前两指针确定的范围内,先比较两头找出较小值,如果较小值是left指向的值,那么就从左向右扫描,如果较小的值是right指向的值,则从右向左扫描,若遇到的值比当前较小值小,则将差值存入结果,如果遇到的值大,则重新确定新的窗口范围,以此类推直到left和right指针重合。

代码:
public class Solution{
    public int trap(int[]height){
        int left=0;
        int right=height.length-1;
        if(height==null||height.length==0)
            return 0;
        int res=0;
        while(left<right){
            int min=Math.min(height[left],height[right]); //找到两端较小的值
            if(min==height[left]){
                ++left;
                while(left<right&&height[left]<min){
                    res=res+min-height[left];
                    left++;
                }
            }else{
                --right;
                while(left<right&&height[right]<min){
                    res=res+min-height[right];
                    right--;
                }
            }
        }
        return res;
    }
}

转载于:https://www.cnblogs.com/yjxyy/p/11098010.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值