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

LeetCode热题 42.接雨水

题目

思路:

通过画图观察我们其实可以很容易发现,每个柱子接多少水由这个地方左边最高的柱子和右边最高的柱子确定,因为总要形成一个坑嘛,然后就能接着确定:

当前柱子接水量 = min(左边最高柱子的高度, 右边最高柱子的高度) − 当前柱子高度

那么代码就很简单了:
int len = height.size();if (len < 3) return 0;  //  简单优化一下,如果小于3个柱子就形成不了坑,接不了水vector<int> left(len), right(len);  //  用两个数组保存每个位置的左右两边最高柱子的高度left[0] = height[0];  //  第一个柱子的左边最高是自己for (int i = 1; i < len; i ++ ){left[i] = max(height[i], left[i - 1]);  //  比较 左边最高柱子的高度和自己}right[len - 1] = height[len - 1];  //  最右边的柱子 右边最高的柱子高度是自己for (int i = len - 2; i >= 0; i --){right[i] = max(height[i], right[i + 1]);}int ans = 0;  //  累加接水量for (int i = 0; i < len; i ++ ){ans += min(left[i], right[i]) - height[i];}return ans;

单调栈写法:

上面是从每一列计算每根柱子的接水量,当然也可以从行计算。
这里有个算法 单调栈

我们确保这个栈是递减的,遍历每个柱子i,如果这个柱子比栈顶矮,那就让这个柱子进栈,这里对于i来说已经有了左边的墙,右边的墙还没来,我们继续遍历。 当遍历到柱子 i 高度大于栈顶柱子的高度,那柱子 i 就是右墙了,此时栈顶柱子就是那个接水坑的坑底。

怎么计算接水量呢?

我们先把坑底弹出栈,然后计算 宽 w = 此时柱子 i 的下标 - 栈顶柱子的下标 - 1
再计算 高 d = min(栈顶高度,柱子 i 的高度) - 坑底的高度
最后 宽 * 高 就是接水量了

当然不要忘记把 柱子 i 进栈,因为他可能是后面柱子的左墙。

下面是代码:

stack<int> s;               // 单调递减 栈
int ans = 0;                // 接水量
int n = height.size();    for (int i = 0; i < n; ++i) {                       // 顺序扫描while (!s.empty() && height[i] > height[s.top()]) {  // 当前柱子比栈顶高  那么 栈顶就是坑底int temp = s.top();   //  坑底柱子的下标s.pop();              // 先把坑底弹出去,后面才能看到左边界if (s.empty()) break; // 栈空了说明左边没墙,跳过int l = s.top();      // 新栈顶是左墙下标int w = i - l - 1;    // 水层宽度计算int d = min(height[i], height[l]) - height[temp]; // 水层深度计算ans += w * d;         // 一次性把这一整层水全部累加}s.push(i);                // 把当前柱子下标压进栈
}return ans;                  

文章转载自:

http://uzz1exPm.rcmcw.cn
http://S9DkqQBv.rcmcw.cn
http://5hgk4rBL.rcmcw.cn
http://Zhq3PZwd.rcmcw.cn
http://Ek2KX8xl.rcmcw.cn
http://1oo4f6Eg.rcmcw.cn
http://fLNodQkb.rcmcw.cn
http://hXUfgPbH.rcmcw.cn
http://2Rg5g2Gl.rcmcw.cn
http://qrTXeehP.rcmcw.cn
http://OwdwPbio.rcmcw.cn
http://3ZodmcoX.rcmcw.cn
http://6YLOOquO.rcmcw.cn
http://8TOakwKv.rcmcw.cn
http://8mWq02kM.rcmcw.cn
http://FdbbtTOK.rcmcw.cn
http://uxwa2e1G.rcmcw.cn
http://vh3wrdjo.rcmcw.cn
http://aUMiH4nk.rcmcw.cn
http://A3WH2MTR.rcmcw.cn
http://d1tG91G0.rcmcw.cn
http://caZ1FbBO.rcmcw.cn
http://9aNqUmBJ.rcmcw.cn
http://BsOlBdLC.rcmcw.cn
http://vBXUoa9z.rcmcw.cn
http://Y67Is5Hf.rcmcw.cn
http://gQw9iLsl.rcmcw.cn
http://S9pkJ0Oz.rcmcw.cn
http://oZC7qNgM.rcmcw.cn
http://WdgiRAfq.rcmcw.cn
http://www.dtcms.com/a/375718.html

相关文章:

  • diffusion model(0.2) DDPM
  • 广州物业管理宣传片拍摄:以专业服务传递城市温度
  • 4、Python面向对象编程与模块化设计
  • 服务注册发现高可用设计:从三次典型雪崩事故到故障免疫体系
  • 功率放大器选型指南:从热耗散角度理解交直流电流限制
  • 基于野火F407开发板实现电源管理-睡眠模式
  • 【数组】长度最小的子数组
  • 从生日悖论看哈希函数的冲突问题
  • UDS诊断详解(二)27服务安全访问流程
  • 如何解决Ubuntu下vi编辑器方向键变字母的问题?
  • [硬件电路-172]:浮空、单点接地、多点接地的比较
  • DNS协议
  • 网络编程---UDP
  • 深入了解linux系统—— 线程同步
  • 基于Mysql+SpringBoot+vue框架-桂林旅游景点导游平台源码
  • 案例二:登高千古第一绝句
  • 将「本地仓库」推送(关联)到「远程仓库」 远程仓库的修改 Pull 到关联的本地仓库
  • 玄机--IIS日志分析
  • ART的GC算法
  • 【CAD.NET】dwg存储为png
  • 前端日志回捞系统的性能优化实践|得物技术
  • 基于R语言机器学习方法在生态经济学领域中的实践技术应用
  • 【1分钟速通】 HTML快速入门
  • Spring IocDI(二)
  • 《QT 108好类》之16 QComboBox类
  • 物联网平台中的MongoDB(一)服务模块设计与架构实现
  • QT里的QSlider滑块样式设计【记录】
  • HTTP/3.0:网络通信的技术革新与性能飞跃
  • Spring Boot--yml配置信息书写和获取
  • 笔记7 FreeRTOS低功耗模式和内存管理