文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【解题思路】
  • 七【时间频度】
  • 八【代码实现】
  • 九【提交结果】

一【题目类别】

  • 双指针

二【题目难度】

  • 困难

三【题目编号】

  • 面试题17.21.直方图的水量

四【题目描述】

  • 给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。
  • 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。 感谢 Marcos 贡献此图。

五【题目示例】

  • 示例:

    • 输入: [0,1,0,2,1,0,1,3,2,1,2,1]
    • 输出: 6

六【解题思路】

  • 本题是双指针的经典应用,解题思路也有一些技巧,我们需要利用木桶的短板效应:一个木桶盛水的多少,由木桶中最短的板子决定
  • 所以我们使用leftMax记录左边最长的板子,使用rightMax记录右边最长的板子,使用left记录左边的数组下标,使用right记录右边的数组下标
  • 对于任意一个位置,只要右边有比左边高的板子,不管中间是什么情况,此位置能存的雨水量,之和最左边的板子相关
  • 对于任意一个位置,只要左边有比右边高的板子,不管中间是什么情况,此位置能存的雨水量,之和最右边的板子相关
  • 基于这个思路,遍历整个数组,不停的更新左边最高的板子和右边最高的板子,并求和每个位置可以存的雨水量
  • 最后返回结果即可

七【时间频度】

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n为传入的数组的长度
  • 空间复杂度: O ( 1 ) O(1) O(1)

八【代码实现】

  1. Java语言版
class Solution {public int trap(int[] height) {int res = 0;int left = 0;int right = height.length - 1;int leftMax = 0;int rightMax = 0;while(left <= right){if(leftMax < rightMax){res += Math.max(0,leftMax - height[left]);leftMax = Math.max(leftMax,height[left]);left++;}else{res += Math.max(0,rightMax - height[right]);rightMax = Math.max(rightMax,height[right]);right--;}}return res;}
}
  1. C语言版
int trap(int* height, int heightSize)
{int res = 0;int left = 0;int right = heightSize - 1;int leftMax = 0;int rightMax = 0;while(left <= right){if(leftMax < rightMax){res += fmax(0,leftMax - height[left]);leftMax = fmax(leftMax,height[left]);left++;}else{res += fmax(0,rightMax - height[right]);rightMax = fmax(rightMax,height[right]);right--;}}return res;
}
  1. Python语言版
class Solution:def trap(self, height: List[int]) -> int:res = 0left = 0right = len(height) - 1leftMax = 0rightMax = 0while left <= right:if leftMax < rightMax:res += max(0,leftMax-height[left])leftMax = max(leftMax,height[left])left+=1else:res += max(0,rightMax-height[right])rightMax = max(rightMax,height[right])right-=1return res
  1. C++语言版
class Solution {public:int trap(vector<int>& height) {int res = 0;int left = 0;int right = height.size() - 1;int leftMax = 0;int rightMax = 0;while(left <= right){if(leftMax < rightMax){res += max(0,leftMax - height[left]);leftMax = max(leftMax,height[left]);left++;}else{res += max(0,rightMax - height[right]);rightMax = max(rightMax,height[right]);right--;}}return res;}
};

九【提交结果】

  1. Java语言版

  2. C语言版

  3. Python语言版

  4. C++语言版

【LeetCode每日一题】——面试题17.21.直方图的水量相关推荐

  1. leetcode 面试题 17.21. 直方图的水量(单调栈)

    给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下, ...

  2. 面试题 17.21. 直方图的水量/42. 接雨水

    2020-05-16 1.题目描述 直方图的水量 2.题解 对于某一个柱体而言,它上面的水量等于它左右两边柱体最大值最小值的大小减去当前柱体的高度. 3.代码 class Solution { pub ...

  3. leetcode每日一题--前缀树;前缀哈希;深搜;面试题 08.04. 幂集;648. 单词替换面试题 01.09. 字符串轮转;剑指 Offer II 062. 实现前缀树

    leetcode每日一题 ps:今天的每日一题没意思,简单的模拟,自己换一道 面试题 08.04. 幂集 幂集.编写一种方法,返回某集合的所有子集.集合中不包含重复的元素. 说明:解集不能包含重复的子 ...

  4. Leetcode每日一题——思路小记

    文章目录 LeetCode每日一题 golang T15 2020.6.12 三数之和,双指针的运用 T70 2020.6.13 斐波那契数列 T1014 2020.6.17 最佳观光:双指针,计算公 ...

  5. leetcode每日一题825. 适龄的朋友 快排+双指针

    本文目录 leetcode每日一题825. 适龄的朋友 快排+双指针 写在前面 题目 示例 提示 思路 代码实现 执行结果 写在后面 leetcode每日一题825. 适龄的朋友 快排+双指针 写在前 ...

  6. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  7. Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)

    思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...

  8. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

  9. leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用

    leetcode每日一题 539. 最小时间差 示例 1: 输入:timePoints = ["23:59","00:00"] 输出:1 示例 2: 输入:ti ...

最新文章

  1. Redhat 6.3 yum 本地源配置
  2. python 矩阵相乘不能交换
  3. base target=_self/IE6、IE7 用法(转)
  4. CORS 跨域-哪些操作不受同源限制
  5. 工作100:v-model自定义是父亲组件得值
  6. 路飞学城Python-Day171
  7. linux gdb检查函数栈,Linux - gdb调试
  8. Qt4_实现Edit菜单
  9. dpkg: error processing package oracle-java8-installer (--configure):
  10. 奇瑞采用英伟达GPU,将实现L3自动驾驶
  11. matlab模拟小球碰撞,在MATLAB中实现模拟小球上抛和反弹运动
  12. Elasticsearch-8.2.0安装问题
  13. 一个从业(非正品)奢侈品十年从业者的经验和历程。
  14. 【052】Emoji Mix-Emoji表情趣味合成
  15. 苹果电脑查看已经连上的WiFi密码(亲测可用)
  16. 华为AC忘记console密码
  17. VC6 各link错误解决
  18. Qt编写数据可视化大屏界面电子看板系统
  19. Java腾讯云支付对接
  20. 登录时设置验证码的作用及实现

热门文章

  1. 【Keras+TensorFlow+Yolo3】教你如何识别影视剧模型
  2. 2.3 过去进行时+过去完成时
  3. 美图影像Topic推荐-AMiner
  4. Neutron 网络服务
  5. 用python研究鬼谷算(韩信点兵)
  6. C语言有关二维数组的讲解
  7. ubuntu16.04 安装配置环境
  8. ElasticSearch全文检索原理及过程
  9. 为什么安装python之后要安装PyCharm?
  10. ROS学习笔记(1)ROS安装(推荐使用鱼香ROS安装工具,少走很多弯路)