leetcode 42.接雨水

本文探讨了LeetCode中第42题——接雨水的问题。通过寻找高度图中的最高点,然后从两侧向最高点遍历,计算能够接住的雨水量。在遍历过程中,若遇到比当前柱子高的,则更新最高点,否则计算并累加雨水体积。这种策略可以有效地解决多盆状地形的雨水计算问题。
摘要由CSDN通过智能技术生成

题目

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

题解

能够接到雨水,则肯定是盆状的设计。因此,我们只需要找到2端较高柱子的位置,就可以计算出在这2个区域内能够接到多少的雨水。
由于同时寻找2个较高的柱子比较难以实现,且可能存在多个盆装的地形,因此,我们首先寻找出这些柱子的最高点 heightest ,再进行讨论。
当我们找到最高点 heightest 时,分别 从左往最高点遍历从右往最高点遍历 ,这2种遍历都遵循以下规则:

①定义指针 tmp 指向最左端(最右端);
②从左往右(从右往左)进行遍历,若下一个值大于 tmp ,则将其赋值给 tmp ,否则,计算水域大小 tmp-height[i] ,继续遍历,直至最高点;
③将水域大小累加,即可得到水域的总面积。

当最高点敲定的时候,左边(右边)的柱体若与下一个柱体(靠近最高点方向)有落差,则必然会被水填满。因为靠近最高点方向必有高于该柱体的柱子存在(最高柱)。因此,每次仅需计算落差值,再累加,即可得到最终数值。

public int trap(int[] height) {
	int square = 0;
	int left = -1;
	int right = -1;
	int heightest = -1;
	int heightest_index = -1;
	List<Integer> mid = new ArrayList<Integer>();
	
	if(height.length <= 1) {
		return 0;
	}
	
	// 寻找最高点
	for(int i = 0; i < height.length; i++) {
		if(height[i] > heightest) {
			heightest = height[i];
			heightest_index = i;
		}
	}
	
	// 计算左侧
	int tmp = height[0];
	for(int i = 1; i < heightest_index; i++) {
		if(height[i] > tmp) {
			tmp = height[i];
		}else {
			square += tmp - height[i];
		}
	}
	
	
	// 计算右侧
	tmp = height[height.length-1];
	for(int i = height.length-2; i > heightest_index; i--) {
		if(height[i] > tmp) {
			tmp = height[i];
		}else {
			square += tmp - height[i];
		}
	}
	
	return square;
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值