1、题目如下:
2、个人Python代码实现(部分用例超时)
本地执行大概超过30S,力扣显示超时
3、个人Python代码思路:
当且仅当nums[i] < nums[i+1],nums[i] < nums[i-1],此时nums[i]才能接到雨水,根据这个点,其实就转换成了两个问题,确定有效数组(可以接雨水) 和雨水量:
a、有效数组,通过从左到右遍历找到nums[i] > nums[i-1],通过从右往左遍历找到nums[j-1] < nums[j],此时nums[i: j+1]就是有效数组,因为该数组一定是nums[0] > nums[1],nums[-2] < nums[-1]
b、雨水量,将求总雨水量转换成分次求雨水量再求和。分次求雨水量的方式是,通过找到数组nums[1]到nums[-2]中非0元素的最小值step,再将数组每一个元素减去step,这里面除了nums[0]和nums[-1],每一个其他元素减去的step之和就是每一次的雨水量 。以示例1为例:
这里上图还需要进行一个优化,示例1中分次求雨水量的原理是找到数组中小于等于0的数值进行计数,每存在一个小于等于0的数值,雨水量+1,示例1是没有问题的,因为数据量小,如果将示例1中nums[1:-1]每一个元素+100呢,本身还是可以3次循环解决,但是按照+1的代码逻辑,需要循环103次。所以就引入了变量step,用于找到数组里面的最小值。
代码放在附件了,如果刚好有小伙伴下载了不能用,还请好心人说一声,后面就不上传附件了,直接复制粘贴在文章里面。