【Pinsel Fragen Tagebuch】 42. Fangen Sie den Regen

Angebot kommt, grab Freunde zum abholen! Ich nehme an der Rekrutierungs-Check-in-Veranstaltung im Frühjahr 2022 teil. Klicken Sie hier, um die Veranstaltungsdetails anzuzeigen .

【Pinsel Fragen Tagebuch】 42. Fangen Sie den Regen

Der 14. Artikel dieses Schreibtagebuchs trägt den Titel: 42. Es ist schwierig , den Regen einzufangen

1. Themenbeschreibung:

Auch bei dieser Frage ist der Titelausdruck auf den ersten Blick sehr einfach und klar, aber es ist eine schwierige Frage

Stimmt es, dass die Fragen umso schwieriger sind, je weniger Fragen gestellt werden ? Aber es sollte in Ordnung sein, wir haben den letzten Artikel geschrieben [Brush Questions Diary] 11. Der Behälter , der das meiste Wasser enthält, es scheint, dass diese beiden Fragen ein bisschen ähnlich sind, wir können es definitiv lösen, lass uns einen Blick darauf werfen

2. Gedankenanalyse:

1. Welche Idee untersucht diese Frage? Was denkst du?

Egal, großer Bruder, wir können jedes Problem lösen. Selbst wenn wir es eine Weile nicht lösen können, können wir es studieren und andere um Rat fragen. Am Ende können wir es immer lösen. Glaub an dich

Das Gleiche gilt bei der Arbeit, richtige Einstellung, wenn Sie auf Probleme stoßen, denken Sie mehr über die Logik und die Prinzipien dahinter nach und bemühen Sie sich, in Zukunft alle Arten von Problemen zu lösen

Schauen wir uns zunächst an, welche wichtigen Informationen uns diese Frage zeigt:

  • Erstens ist dies eine schwierige Frage, und wir sollten sie so umfassend wie möglich betrachten, ohne uns unter Druck zu setzen .
  • Zweitens geht es hier auch um die Berechnung des Volumens, das etwas anders ist als beim vorherigen [Brush Question Diary] 11. Der Behälter, der das meiste Wasser fasst , aber es kommt darauf an, ob er Regenwasser standhalten kann, oder es kommt auf die Mängel an .
  • Hier müssen wir beachten, dass die Länge n des durch den Titel angegebenen Arrays von 1 bis zur 4. Potenz von 10 reicht

Denken wir so, um Regenwasser zu berechnen?

Traversieren Sie von links nach rechts, wenn die rechte Seite höher ist als die linke Seite, berechnen Sie den Höhenunterschied und ziehen Sie dann die Höhe der Säule ab

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

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

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

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

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

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

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

三、编码

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

编码如下:

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. 接雨水

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

欢迎点赞,关注,收藏

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

好了,本次就到这里

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

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

Ich denke du magst

Origin juejin.im/post/7079718479661629470
Empfohlen
Rangfolge