当前位置: 首页 > news >正文

力扣热门100题之接雨水【困难】

题目描述

给定 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

解法1 按列计算

/*** @param {number[]} height* @return {number}*/
var trap = function(height) {let area=0;let leftMax=0;let rightMax=0;for(let i=0;i<height.length;i++){rightMax=findRightMax(leftMax,i,height);if(height[i]<leftMax&&rightMax>height[i]){area+=Math.min(leftMax,rightMax)-height[i];}else if(!findRightMax(leftMax,i,height)){leftMax=height[i];}if(height[i]>leftMax) leftMax=height[i];}return area;
};
function findRightMax(num,j,height){let n=0;for(let i=j;i<height.length;i++){if(height[i]>=num){return height[i];}if(height[i]>n)n=height[i]}return n;
}

执行结果:
在这里插入图片描述
解法2:双指针解法【注意理解】

/*** @param {number[]} height* @return {number}*/
var trap = function(height) {let area=0;if(height.length<=1) return 0;let left=0;let leftMax=0;let right=height.length-1;let rightMax=0;while(left<right){leftMax=Math.max(leftMax,height[left]);rightMax=Math.max(rightMax,height[right]);if(height[left]<height[right]){area+=leftMax-height[left];left++;}else{area+=rightMax-height[right];right--;}}return area;
};

执行情况:
在这里插入图片描述
解法3:单调栈【参照力扣官方】

/*** @param {number[]} height* @return {number}*/
var trap = function(height) {let area=0;if(height.length<=1) return 0;const stack=[]//存值值单调递减的下标for(let i=0;i<height.length;i++){while(stack.length&&height[i]>height[stack[stack.length-1]]){let top=stack.pop();if(stack.length==0){break;}const left = stack[stack.length - 1];const currWidth = i - left - 1;const currHeight = Math.min(height[left], height[i]) - height[top];area += currWidth * currHeight;}stack.push(i);}return area;
};

在这里插入图片描述

http://www.lryc.cn/news/95999.html

相关文章:

  • Stable-Diffusion-Webui部署SDXL0.9报错参数shape不匹配解决
  • Springboot @Async 多线程获取返回值
  • 怎样接入chatGPT
  • Docker consul容器服务更新与发现
  • [算法很美打卡] 多维数组篇 (打卡第一天)
  • 微服务系列(1)-who i am?
  • 记录这这段时间发生的事情。
  • 发布npm包流程
  • 面试官:Redis 为什么变慢了?怎么解决?
  • Docker:开启应用程序开发新篇章的利器
  • Python面向对象(三)(继承、封装)
  • Redis Stream 流的深度解析与实现高级消息队列【一万字】
  • 一个灵活、现代的Android应用架构
  • redis高级篇 springboot+redis+bloomfilter实现过滤案例
  • mybatis学习笔记之在WEB中应用MyBatis
  • 宿主可以访问公网 Docker容器里无法访问 Temporary failure in name resolution
  • CentOS7系统MBR、GRUB2、内核启动流程报错问题
  • 剑指YOLOv5改进最新MPDIoU损失函数(23年7月首发论文):超越现有多种G/D/C/EIoU,高效准确的边界框回归的损失,高效涨点
  • CAN bus off ——ISO11898
  • 如何评测一个大语言模型?
  • React中useMemo和useCallback的区别
  • SpringBoot 快速实现IP地址解析
  • 亚马逊、速卖通,阿里国际等平台测评如何用自养号测评补单
  • ubuntu挂载ext4文件系统
  • MySQL 读写分离
  • 【多线程例题】顺序打印abc线程
  • WebSocket工具类
  • Linux 的 crontab
  • 十二.Redis模拟集群搭建
  • IDEA导入微服务项目后自动将微服务展示在service面板中