【Diario de preguntas de pincel】 42. Atrapa la lluvia

Llega oferta, cava amigos a recoger! Estoy participando en el evento de registro de reclutamiento de primavera de 2022, haga clic para ver los detalles del evento .

【Diario de preguntas de pincel】 42. Atrapa la lluvia

El artículo 14 de este diario de escritura se titula: 42. Es difícil atrapar la lluvia

1. Descripción del tema:

A primera vista de esta pregunta, la expresión del título también es muy simple y clara, pero es una pregunta difícil.

¿Es cierto que cuantas menos preguntas se expresan, más difíciles son las preguntas ? Pero debería estar bien, escribimos el último artículo [Brush Questions Diary] 11. El recipiente que contiene más agua, parece que estas dos preguntas son un poco similares, definitivamente podemos resolverlo, echemos un vistazo

2. Análisis del pensamiento:

1. ¿Qué idea examina esta pregunta? ¿Cuál es tu pensamiento?

No importa, hermano mayor, podemos resolver cualquier problema. Incluso si no podemos resolverlo por un tiempo, podemos estudiarlo y pedir consejo a otros. Al final, siempre podemos resolverlo. Cree en ti mismo.

Lo mismo es cierto en el trabajo, actitud correcta, cuando encuentre problemas, piense más en la lógica y los principios detrás de esto, y esfuércese por resolver todos los mismos tipos de problemas en el futuro.

Comencemos por ver qué información importante nos muestra esta pregunta:

  • Primero, esta es una pregunta difícil, y debemos considerarla de la manera más completa posible sin sentirnos presionados .
  • En segundo lugar, también es una cuestión de calcular el volumen, que es ligeramente diferente del anterior [Brush Question Diary] 11. El recipiente que contiene más agua , pero depende de si puede soportar el agua de lluvia o depende de las deficiencias. .
  • Aquí debemos tener en cuenta que la longitud n de la matriz dada por el título varía de 1 a la cuarta potencia de 10

¿Pensamos así para calcular el agua de lluvia?

Recorra de izquierda a derecha, cuando el lado derecho es más alto que el lado izquierdo, calcule la diferencia de altura y luego reste la altura de la columna en el proceso

但是发现,其实逻辑这么纯粹是有问题的,因为右边的柱子并不都左边高,反之亦然,发现上图中,按照纯粹的逻辑是走不通的,中间可能存在我们考虑不周的场景和逻辑

那么我们思考一下,如果我们能有办法直接计算出某一列他能接多少单位的雨水,这样一来,处理起来岂不是更明确了?

如何来计算当前列到底能承接多少雨水呢?

还是这个原理,一个桶能装多少水,取决于短板,那么当前列是否可以承接雨水,能承接多少雨水,也取决于当前列,是否比左边和比右边短

则,我们可以看到如下的图演示

通过查看上图演示,我们知道当前列能承接多少雨水,只需要计算当前列的最左边的身高,最右边的身高,得到他们的最小值之后,再减去当前列自己的身高,即可计算出来

那么接下来,咱们就来简单的实现一下上述的思想吧,这个逻辑就很明确了,按照列来计算承接的雨水,然后对所有列求和

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

编码如下:

func trap(height []int) int {
    // 计算每一列左边的最大高度
    leftMax := make([]int, length)
    leftMax[0] = height[0]
    for i:=1; i< length-1; i++ {
        leftMax[i] = max(leftMax[i-1], height[i])
    }
    // 计算每一列右边的最大高度
    rightMax := make([]int, length)
    rightMax[length-1] = height[length-1]
    for i:=length - 2; i>= 0; i-- {
        rightMax[i] = max(rightMax[i+1], height[i])
    }

    // 计算当前列的实际雨水单位数
    res := 0
    for i,h := range height {
       tmp := min(leftMax[i],rightMax[i])
       if tmp > h{
           // 当前列是短板的时候,才能承接雨水
            res += tmp - h
       }
    }
    return res
}

func max(a,b int)int{
    if a>b {
        return a
    }
    return b
}

func min(a,b int)int{
    if a<b {
        return a
    }
    return b
}
复制代码

上述就是根据思路实现的代码,思路清晰了,编码就是一个翻译的过程,考虑好各种场景,咱们实现起来就比较顺畅,可以减少返工和出现 bug 的风险

四、总结:

这题的时间复杂度和空间复杂度都是 O(n),原因是我们只需要遍历一次 height 数组,且我们引入的O(n) 级别的空间消耗

原题地址:42. 接雨水

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

Supongo que te gusta

Origin juejin.im/post/7079718479661629470
Recomendado
Clasificación