当前位置:首页 > > 后端技术指南针
[导读]今天给大家带来的是一道特别特别特别经典的题目接雨水问题,这个问题是很多算法书上面举例过的题目。虽然是难度题,但是相对来说还是比较容易理解的,代码长度也适中,说了这么多,就一个意思,大家记得打卡这个题目啊,真的是很nice的一道题,下面我们来看一下题目描述。

接雨水

今天给大家带来的是一道特别特别特别经典的题目接雨水问题,这个问题是很多算法书上面举例过的题目。虽然是难度题,但是相对来说还是比较容易理解的,代码长度也适中,说了这么多,就一个意思,大家记得打卡这个题目啊,真的是很nice的一道题,下面我们来看一下题目描述。
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

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

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

示例3:

输入:[4,3,2,0,1,1,5]
输出:13

说明:上面是由数组 [4,3,2,0,1,1,5]表示的高度图,在这种情况下,可以接 13个单位的雨水(见下图)。

题目解析:

看了上面的示例刚开始刷题的同学可能有些懵逼,那我们结合图片来理解一下,我们就用示例3的例子进行举例,他的雨水到底代表的是什么。输入代表的是黄色箱子的个数,蓝色箱子代表雨水数量。缝隙之间可以装多少水


上图则为我们的题目描述,是不是理解了呢?你也可以这样理解我们在地上放置了若干高度的黄色箱子,他们中间有空隙,然后我们想在他们里面插入若干蓝色箱子,并保证插入之后,这些箱子的左视图和右视图都不能看到蓝色箱子。
好啦题目我们已经理解了,下面我们看一下解题思路。做这个题前我们可以先去看一下我们之前做过的另一道题目 每日温度 。这两道题目的思路差不多,都是利用了单调栈的思想,下面我们来看一下具体思路吧。
这里我们也系统的说一下 单调栈 ,单调栈含义就是栈内的元素是单调的,我们这两个题目用到的都是递减栈(相同也可以),我们依次将元素压入栈,如果当前元素小于或等于栈顶元素则入栈,如果大于栈顶元素则先将栈顶不断出栈,直到当前元素小于或等于栈顶元素为止,然后再将当前元素入栈。就比如下图的4,想入栈的话则需要2,3出栈之后才能入栈,因为4大于他俩。


我们了解单调栈的含义下面我们来看一下接雨水问题到底该怎么做,其实原理也很简单,我们通过我们的例3来进行说明。
首先我们依次入栈4,3,2,0我们的数组前四个元素是符合单调栈规则的。但是我们的第五个1,是大于0的。那我们就需要0出栈1入栈。但是我们这样做是为了什么呢?有什么意义呢?别急我们来看下图。



上图我们的,4,3,2,0已经入栈了,我们的另一个元素为1,栈顶元素为0,栈顶下的元素为2。那么我们在这一层接到的雨水数量怎么算呢?2,0,1这三个元素可以接住的水为一个单位(见下图)这是我们第一层接到水的数量。
注:能接到水的情况,肯定是中间低两边高的情况

因为我们需要维护一个单调栈,所以我们则需要将0出栈1入栈,那么此时栈内元素为 4,3,2,1。下一位元素为1,我们入栈,此时栈内元素为4,3,2,1,1 。下一元素为5,栈顶元素为1,栈顶的下一元素仍为1,则需要再下一个元素,为2,那我们求当前层接到的水的数量。
注:栈内保存的应是索引值,这里为了便于理解用了value值


我们是通过2,1,1,5这四个元素求得第二层的接水数为1*3=3;1是因为min(2-1,5-1)=min(1,4)得来的,大家可以思考一下木桶效应。装水的多少,肯定是按最短的那个木板来的,所以高度为1,3的话是因为5的索引为6,2的索引为2,他们之间共有三个元素(3,4,5)也就是3个单位。所以为6-2-1=3。
将1出栈之后,我们栈顶元素就变成了2,下一元素变成了3,那么3,2,5这三个元素同样也可以接到水。

这是第三层的接水情况,能够接到4个单位的水,下面我们继续出栈2,那么我们的4,3,5仍然可以接到水啊。


这是我们第四层接水的情况,一共能够接到5个单位的水,那么我们总的接水数加起来,那就是1+3+4+5=13。你学会了吗?别急还有动图我们,我们再来深入理解一哈。


接雨水

题目代码:

    
class Solution {
    public int  trap(int[] height) {
         Stack stack = new Stack();
         int water = 0;
         //特殊情况       
          if(height.length < 3){
     return 0;
         }       
          for(int i = 0; i < height.length; i++){
              while(!stack.isEmpty() && height[i] > height[stack.peek()])       
                 //栈顶元素
                 int popnum = stack.pop(); 
                 //相同元素的情况例1,1     
                  while(!stack.isEmpty()&&height[popnum] == height[stack.peek()]){
                     stack.pop();
                 } 
                 //计算该层的水的单位
                  if(!stack.isEmpty()){
                     int temp = height[stack.peek()];//栈顶元素值        
                     //高      
                     int hig = Math.min(temp-height[popnum],height[i]-height[popnum]);
                     //宽
                     int wid = i-stack.peek()-1;
                     water += hig * wid;
                 }

             }       
             //这里入栈的是索引
             stack.push(i);
         }
          return water;
    }
}


这个题解的图片太多了,整了挺久,因为怕浪费了这道经典题,所以画了很多图片进行说明,希望可以帮到大家。下周就是字符串啦,大家加油啊!


我以后每天会在文章下面放一个读者讨论(目前还没有留言功能),大家阅读完文章消化过之后可以在下面打卡,这样也算是给自己一个总结。另外我以后还会在文章下面放一个面试逻辑题,以备不时之需,大家也可以对逻辑题进行讨论。
 
添加大白微信 欢迎技术交流:baymax9901



免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭