狠抓技术-42. 接雨水
这道题以前也在书上碰到过,没有深入思考,书上的解题也很麻烦,感觉不是那回事
找规律
// 当前位置n能接到的雨水,取决于n左边的最大高度,n右边的最大高度,以及当前的高度
// 统计n左边的最大高度,n右边的最大高度
动态规划公式:f(n)={
min(left,right)-height[n] left<n right>n
}
给定 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 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5]
输出:9
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/** * @param {number[]} height * @return {number} */ var trap = function(height) { // 找规律 // 当前位置n能接到的雨水,取决于n左边的最大高度,n右边的最大高度 // 统计n左边的最大高度,n右边的最大高度 // f(n)={ // min(left,right)-height[n] left<n right>n // } const leftArr=[] let maxH=0; //统计n左边的高度 for(let i=0;i<height.length;i++){ leftArr[i]=maxH if(height[i]>maxH){ maxH=height[i] } } maxH=0; //统计n右边的高度 const rightArr=[] for(let i=height.length-1;i>=0;i--){ rightArr[i]=maxH if(height[i]>maxH){ maxH=height[i] } } let total=0; for(let i=0;i<height.length-1;i++){ const minH=Math.min(leftArr[i],rightArr[i]) const d=minH-height[i] if(d>0){ total=total+d } } return total; };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下