数据结构与算法-练习打卡day12(接雨水)

数据结构与算法-练习打卡day12

问题:

题目地址,点我
在这里插入图片描述

解题:

分析:多种思路吧,我的一定想法是判断波峰,然后获得波峰之间的水,但是需要考虑波峰之间的关系,比如中间都是小波峰,边缘都是大波峰,就比较尴尬;还有一种比较好理解的就是两个方向都计算一下,然后取双方重叠的部分如下图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思来想去,还是想继续让判断波峰的程序可以使用,就是得判断边界是不是向内部递减的,这样边界也要算到波峰中,去掉中间的波峰就得判断中间部分的波峰是不是比两次的波峰小,这样的话,为什么不直接从两侧开始判断呢,就找到了双指针的方法,两侧都获取到两侧的最大值,要是当前值比较小,就计算一下跟当前侧最大值的差,进行累加,当前是波峰无所谓,就是0,要是比最大值小,那肯定可以有水,毕竟两侧同事开始判断,并不会重复,还可以剔除掉中间比较小的波峰值,直接过滤了

class Solution {
	public int trap(int[] height) {
		// 需要找到波峰波谷
		if (null == height || height.length < 3) {
			// 小于3没有波峰波谷
			return 0;
		}
		// 找到波峰,波谷 key index value 峰值
		// 去掉中间低位的峰值 双指针
		int leftIndex = 0,
				rightIndex = height.length - 1,
				maxLeft = 0,
				maxRight = 0,
				count = 0;
		while (rightIndex > leftIndex) {
			// 获取左右的最大值
			maxLeft = Math.max(maxLeft, height[leftIndex]);
			maxRight = Math.max(maxRight, height[rightIndex]);
			if (height[leftIndex] < height[rightIndex]) {
				// 如果左边当前值比较小,先计算左边的雨水
				count += maxLeft - height[leftIndex];
				// 当前位置计算完成,下一个
				leftIndex++;
			} else {
				// 如果右边边当前值比较小,先计算左边的雨水
				count += maxRight - height[rightIndex];
				// 当前位置计算完成,下一个
				rightIndex--;
			}
		}
		return count;
	}
}

性能:

运算简单,操作都是数字,速度比较快
在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值