题目:

给定一个数组,每个位置的值代表一个高度,那么整个数组可以看做是一个直方图,

如果把这个直方图当作容器的话,求这个容器能装多少水

例如:3,1,2,4

代表第一个位置高度为3,第二个位置高度为1,以此类推,这个直方图能装3格水。如图红色地方:

思路:很多人会误想到正出什么波峰波谷,这就从开始就错了,比如两个相邻的波峰之外还有更大的波峰,这么说来你中间这连个波峰波谷算的值多白算了,这个用直接点的想法来做就可以了,就找当前i位置上能装多少水,就是从i位置向前和后遍历,找到前后max值较小的减去当前i位置的值就是能装的水,当然要是前或后没找到i位置小的,那么就不能装水(给你5分钟画图理解下这个思想)。思路有了,考虑解法:

1、暴力解法,每个i位置,都前后遍历,这个方法的时间复杂度为O(n2),

public static int getWater(int[] arr) {if (arr == null || arr.length < 3) {return 0;}int sum = 0;for (int i = 1; i < arr.length - 1; i++) {int leftMax = arr[0];for (int j = 0; j < i; j++) {if (arr[j] > leftMax) {leftMax = arr[j];}}int rightMax = arr[arr.length - 1];for (int k = arr.length - 1; k > i; k--) {if (arr[k] > rightMax) {rightMax = arr[k];}}sum += Math.max(0, Math.min(leftMax, rightMax) - arr[i]);}return sum;}

2,空间换时间,预处理数组,在找i之前,定义一个0-i位置最大大值数组,做法就是右滑数组,再定义一个i-length-1的最大是数组,做法就是左滑数组,然后找i上能装的水时,不用前后找,只需要查表就可以,这个时间复杂度为O(n),空间复杂度为O(n)。

3、时间复杂度为O(n),空间复杂度为O(1),厉害了这个,想不想听,想不想学,定义一个左指针,指向第二个元素,一个有指针,指向倒数第二个元素,因为一个和最后一个肯定不能储水,设置左边最大值为arr[0],右边最大值为arr[arr.length-1],只需要判断左边最大值与右边最大值即可,当左边最大值小于右边最大值,左指针右滑,左指针位置上能装的水就是左边对大值减去左指针指的值,若左指针指向的值大于左边大值,就不减,说明不能储水,更新左边最大值,当右边最大值小于左边最大值时,右指针左滑,做法跟前类似,直到左指针小于等于有指针跳出循环。反正就一句话,哪边小那边指针移动:

public static int getWater(int[] arr) {if (arr == null || arr.length < 3) {return 0;}int value = 0;int leftMax = arr[0];int rightMax = arr[arr.length - 1];int l = 1;int r = arr.length - 2;while (l <= r) {if (leftMax <= rightMax) {value += Math.max(0, leftMax - arr[l]);leftMax = Math.max(leftMax, arr[l++]);} else {value += Math.max(0, rightMax - arr[r]);rightMax = Math.max(rightMax, arr[r--]);}}return value;}

相同思想的另一种写法

public static int getWater(int[] height) {int res = 0;int l = 0, r = height.length - 1, level = 0;while (l < r) {int lower = height[height[l] < height[r] ? l++ : r--];level = Math.max(level, lower);res += level - lower;}return res;}

【算法系列之四】柱状图储水相关推荐

  1. HDR视频色调映射算法(之四:Display adaptive TMO)

    本文是HDR视频色调映射算法系列之四,Display adaptive TMO算法介绍. 关注公众号,获取更多信息!

  2. 白话经典算法系列之七 堆与堆排序

     堆排序与高速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先解说下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是全然二叉树或者是近似全然二叉树. 二叉堆满 ...

  3. leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!

    作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...

  4. 去掉数组最后一个元素_leetcode 34. 在排序数组中查找元素的第一个和最后一个位置每天刷一道leetcode算法系列!...

    作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...

  5. python算法系列资料集(一)-2022.03.15

    小学生学python(一) 小学生学python(一) - 超龄码农 - 博客园 小学生学python(二) 小学生学python(二) - 超龄码农 - 博客园 小学生学python(三) 小学生学 ...

  6. 隐马尔科夫模型(Hidden Markov Models) 系列之四

    隐马尔科夫模型(Hidden Markov Models) 系列之四 介绍(introduction) 生成模式(Generating Patterns) 隐含模式(Hidden Patterns) ...

  7. 排序算法系列之(二)——冒泡排序名字最为形象的一个

    前言 大约在上个冬季我给自己挖了一个坑(想要总结排序~~(>_<)~~),感觉把自己埋起来会暖和一点,可是大约一年过去了,埋的越来越深,却丝毫感觉不到暖意--被我的诗意打动了有没有,已经深 ...

  8. 狼羊菜过河问题c语言算法,算法系列之十四:狼、羊、菜和农夫过河问题

    题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种方法,让农夫能够 ...

  9. [算法系列] 深入递归本质+经典例题解析——如何逐步生成, 以此类推,步步为营

    [算法系列] 深入递归本质+经典例题解析--如何逐步生成, 以此类推,步步为营 本文是递归系列的第三篇, 第一篇介绍了递归的形式以及递归设计方法(迭代改递归),;第二篇以递归为引子, 详细介绍了快排和 ...

最新文章

  1. 工作那些事(十六)面试时,面试官喜欢的非技术问题汇总
  2. SAP 作业类型主数据
  3. 分页原理+分页代码+分页类制作
  4. android Studio 运行不显示avd 无法运行
  5. linux下用u盘安装xp系统安装教程,全新Linux笔记本电脑用U盘装Win7/XP系统教程
  6. 【vue-router①】router-link跳转页面传递参数 - 进击的前端之路(偶尔爬坑java小路) - SegmentFault 思否
  7. Picture POJ - 1177(矩形周长并))
  8. How to use fb.data.query to get friends info?
  9. JQ基础练习---图片划过变暗
  10. C#算法设计排序篇之03-直接插入排序(附带动画演示程序)
  11. 设计模式笔记二十一:状态模式
  12. 计算机课的情感目标是什么意思,教案中情感目标是什么.doc
  13. javascript 布尔类型
  14. GAN代码实操(github代码实操)
  15. uhs3内存卡有哪些_三分钟教你看懂存储卡标识
  16. Linux下安装MATLAB教程
  17. 达人评测 锐龙r5 5600h和r5 6600h差别大吗
  18. 状语从句——专升本语法
  19. 【Hardware】【史密斯圆图】
  20. 在js中循环遍历json对象

热门文章

  1. spring webflow : 上传单个文件实例
  2. linux传文件file,linux文件的传输与压缩快速入门
  3. Linux下boost库的安装
  4. c语言如何编写mysql客户端_【C/C++学院】(23)Mysql数据库编程--C语言编程实现mysql客户端...
  5. hibernate mysql 性能_MyBatis和Hibernate相比,优势在哪里?
  6. 完整的连接器设计手册_减速齿轮箱的设计 用一整套完整流程来说明(附PDF手册)...
  7. 【转】ABP源码分析三十五:ABP中动态WebAPI原理解析
  8. 开源干货!.NET Core + Vue.js通用动态权限(RBAC)管理系统框架[DncZeus]开源
  9. 在IIS中启用父路径,不被黑客利用
  10. android虚拟电话号码,为何安卓手机坚持虚拟按键?这才是原因