力扣题库刷题笔记42--接雨水(未通过)

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,用于找到数组里面的最小值。

 

         代码放在附件了,如果刚好有小伙伴下载了不能用,还请好心人说一声,后面就不上传附件了,直接复制粘贴在文章里面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值