【每日一题】leetcode 42.接雨水——动态规划

本文介绍了LeetCode中第42题接雨水的问题,通过动态规划的方法来解决。分析了时间复杂度和空间复杂度,并提供了从左到右和从右到左分别获取最大高度的策略,最终计算出可以接住的雨水总量。
摘要由CSDN通过智能技术生成

leetcode 42.接雨水

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

示例 1:

在这里插入图片描述

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)

读题

在这里插入图片描述

对于当前位置[3],雨水能达到的最大高度等于[3]两边的最大高度的最小值(类似短板),[3]处能接的雨水等于[3]处的水能达到的最大高度减去height[3],即[3]处的雨水高度等于 min(1,3) - 0 = 1- 0 = 1

思路

如果我们对于每一个位置都进行一次查找两侧最大高度的操作,height的长度为n,那么时间复杂度为O(n^2),显然会超时,所以要进行优化。

如果将每个位置左侧和右侧的最大值先存起来,那么就只需要在每个位置进行比较,选取左侧最大值和右侧最大值的较小值减去当前位置的高度,时间复杂度为O(n),由于需要将每个位置的左侧和右侧最大值存起来,故需要两个大小为height长度的空间,空间复杂度为O(n)。

第i个位置的左侧最大值可以用max(LeftMax[i-1], height[i])来确定,故从左往右遍历,就能得到LeftMax[]。

类似的右侧的最大值可以用max( height[i] , RightMax[i+1])来确定,所以从右往左遍历,就能得到RightMax[]。

得到两个数组后,再次遍历,对每个位置选取两边的最大高度的最小值,即min(LeftMax[i],RightMax[i])与当前高度作差就能得到当前位置的雨水量,最后将每个位置的雨水量求和就得到了最后的答案。

源码:

class Solution 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值