【算法系列之四】柱状图储水

题目:

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

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

例如: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;}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

盐城大数据产业园人才公寓_岳西大数据产业园规划设计暨建筑设计方案公布,抢先一睹效果图...

近日&#xff0c;岳西县大数据产业园规划设计暨建筑设计方案公布。岳西县大数据产业园项目总占地面积17014.10㎡(约合25.52亩)&#xff0c;拟建总建筑面积约为61590.84㎡(地上建筑面积39907.49㎡&#xff0c;地下建筑面积21602.35㎡)。以“科技圆环”为主题&#xff0c;组建出一…

【算法系列之五】对称二叉树

给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1/ \2 2/ \ / \ 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1/ \2 2\ \3 3 说明: 如果你可以运用递归和迭代两种方法解决这个问题&a…

【算法系列之六】两整数之和

不使用运算符 和 - &#xff0c;计算两整数 a 、b 之和。 示例 1: 输入: a 1, b 2 输出: 3示例 2: 输入: a -2, b 3 输出: 1 方法一&#xff1a;递归 public static int getSum1(int a, int b) {if ((a & b) ! 0) { // 判断是否有进位return getSum1(a ^ b, (a &…

cuda默认函数与c++冲突_好程序员Python教程系列-第8讲:函数和模块

好程序员Python教程系列-第8讲&#xff1a;函数和模块&#xff0c;在讲解本章节的内容之前&#xff0c;我们先来研究一道数学题&#xff0c;请说出下面的方程有多少组正整数解。事实上&#xff0c;上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案&#xff0c;所…

【算法系列之七】合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1->1->2->3->4->4/*** Definition for singly-linked list.* public cla…

mfc让图片与按钮一起_对许多张图片进行批量裁剪,看看我是如何快速做到的

概要&#xff1a;当我们需要对很多图片进行批量裁剪时&#xff0c;以往的办法是自己一张一张图片去操作&#xff0c;非常麻烦。有没有这样一个工具&#xff0c;能够帮我们批量进行处理呢&#xff1f;之前小编在网上找了非常多的软件&#xff0c;一个一个地安装试用&#xff0c;…

【算法系列之八】删除链表的倒数第N个节点

给定一个链表&#xff0c;删除链表的倒数第 n 个节点&#xff0c;并且返回链表的头结点。 示例&#xff1a; 给定一个链表: 1->2->3->4->5, 和 n 2.当删除了倒数第二个节点后&#xff0c;链表变为 1->2->3->5.说明&#xff1a; 给定的 n 保证是有效的…

手写分页sql_分页查询SQL语句

表结构&#xff1a;DROP TABLE IF EXISTS zhoufoxcn.userlist;CREATE TABLE zhoufoxcn.userlist (UserId int(10) unsigned NOT NULL auto_increment,UserName varchar(45) NOT NULL,Age int(10) unsigned NOT NULL default 10,Sex tinyint(3) unsigned NOT NULL default 1,Ta…

【算法系列之九】合并两个有序数组

给定两个有序整数数组 nums1 和 nums2&#xff0c;将 nums2 合并到 nums1 中&#xff0c;使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间&#xff08;空间大小大于或等于 m n&#xff09;来保存 nums2 …

把网卡指定给vm虚拟机_为VMWare虚拟网卡指定静态的MAC地址

当你把虚拟机移到另一台主机或在同一台主机但不同的路径时&#xff0c;虚拟机的MAC地址将会更改。默认情况下VMWare会保证MAC地址的唯一性却不保存固定性&#xff0c;在每次开启虚拟机里的系统时都可能重新分配MAC地址来保证唯一性&#xff0c;若你想保证即使虚拟机被移动后&am…

【算法系列之十】三数之和

给定一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;找出所有满足条件且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 例如, 给定数组 nums [-1, 0, 1,…

android 动态获取全县_省市县 ------ 三级滚动(android)

预先加载仿滚轮实现的全部数据mCityPickerView.init(this);③ 点击响应&#xff1a;ss.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {CityConfig cityConfig new CityConfig.Builder().title("选择城市")//标题.build();m…

发电厂电气部分第三版pdf_火力发电厂电气主接线的特点

根据火力发电厂的容量及其在电力系统中的地位&#xff0c;一般可将火力发电厂分为区域性火力发电厂和地方性火力发电厂。这两类火力发电厂的电气主接线有各自的特点。一、区域性火力发电厂的电气主接线1、单机容量及总装机容量都较大单机容量多为300MW、600MW和少量1000MW,电厂…

【算法系列之十一】k个一组翻转链表

给出一个链表&#xff0c;每 k 个节点一组进行翻转&#xff0c;并返回翻转后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么将最后剩余节点保持原有顺序。 示例 : 给定这个链表&#xff1a;1->2->3-&g…

ghostblog主题_读Ghost博客源码与自定义Ghost博客主题

我使用的Ghost博客一直使用者默认的Casper主题。我向来没怎么打理过自己博客&#xff0c;一方面认为自己不够专业&#xff0c;很难写出质量比较高的文字&#xff1b;另一方面认为博客太耗时间&#xff0c;很容易影响正常的工作内容。最近公司即将搬迁&#xff0c;我的开发工作也…

【算法系列之十二】最接近的三数之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数&#xff0c;使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 例如&#xff0c;给定数组 nums [-1&#xff0c;2&#xff0c;1&#xff0c;-4], 和 target 1…

定义一个dto对象_业务代码的救星——Java 对象转换框架 MapStruct 妙用

在业务项目的开发中&#xff0c;我们经常需要将 Java 对象进行转换&#xff0c;比如从将外部微服务得到的对象转换为本域的业务对象 domainobject&#xff0c;将 domainobject 转为数据持久层的 dataobject&#xff0c;将 domainobject 转换为 DTO 以便返回给外部调用方等。在转…

JVM调优总结 -Xms -Xmx -Xmn -Xss

堆大小设置 JVM 中最大堆大小有三方面限制&#xff1a;相关操作系统的数据模型&#xff08;32-bt还是64-bit&#xff09;限制&#xff1b;系统的可用虚拟内存限制&#xff1b;系统的可用物理内存限制。32位系统 下&#xff0c;一般限制在1.5G~2G&#xff1b;64为操作系统对内存…

discuz设置用户每天回帖数_[建站教程]Discuz3.4设置QQ互联登陆教程

虽然现在很多人已经不在使用QQ了&#xff0c;但瘦死的骆驼比马大&#xff0c;QQ的用户基数还是很大&#xff0c;而且QQ里有大量的年轻用户&#xff0c;像我的表妹&#xff0c;表弟刚上初中。他们是忠诚的QQ用户。为了获取这批年轻的用户&#xff0c;我们还是有必要让网站支持QQ…

五种线程池的对比与使用

今天对五种常见的java内置线程池进行讲解。 线程使用的demo public static void cache() {ExecutorService pool Executors.newCachedThreadPool();long start System.currentTimeMillis();pool.execute(() -> {int sum 0;for (int i 0; i < 10; i) {sum (int) Ma…