[LeetCode42]Trapping Rain Water

本文介绍了一种计算一维地形图中雨水积存量的方法。通过两次遍历数组,分别记录每个位置左侧和右侧的最大高度,进而计算出每个位置能够积存的雨水量。最后返回所有位置积水量之和。

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

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.

For example, 
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.


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!

思路,坐标的最大左右边相减就是该坐标点容积

1. 从左到右扫描,找出每个坐标的最大左值 

2. 从右到左扫描,找出每个坐标最大右值

3. 累加每个容积。

001 122 223 333每点最大左值

333 333 322 211每点最大右值

001 122 222 211每点最小的左右最大值

010 210 132 121原始值

相差为每点容积

001 012 100 100 =6

c++

int trap(int A[], int n) {
    if(n<2) return 0;
    int *maxL = new int[n], *maxR = new int[n];
    int maxLR = A[0];
    maxL[0] = 0;
    //from left to right cal max lvalue
    for(int i=1; i<n-1; i++){
        maxL[i] = maxLR;
        if(A[i]>maxLR){
            maxLR = A[i];
        }
    }
    maxLR = A[n-1];
    maxR[n-1] = 0;
    int ttrap = 0, ctrap = 0;
    for(int i=n-2; i>0;i--){
        maxR[i] = maxLR;
        ctrap = min(maxL[i], maxR[i]) - A[i];
        if(ctrap>0)
            ttrap+= ctrap;
        if(maxLR < A[i])
            maxLR = A[i];
    }
    delete maxL, maxR;
    return ttrap;

}

java

public int trap(int[] A) {
		if(A.length<2) return 0;
		int len = A.length;
		int []maxL = new int [len];
		int maxLR = A[0];
		maxL[0] = 0;
		for(int i=1;i<len;i++){
			maxL[i] = maxLR;
			if(A[i]>maxLR)
				maxLR = A[i];
		}
		maxLR = A[len-1];
		int []maxR = new int[len];
		maxR[len-1] = 0;
		int trap = 0;
		for(int i=len-2;i>=0;i--){
			maxR[i] = maxLR;
			int ctrap = Math.min(maxL[i], maxR[i])-A[i];
			if(ctrap>0) trap+=ctrap;
			if(A[i]>maxLR)
				maxLR = A[i];
		}
		return trap;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值