In Algorithmen, die mit Arrays oder Listen arbeiten, zeichnet sich die Zwei-Zeiger-Technik durch ihre Effizienz aus. In diesem Artikel wenden wir es auf das klassische Problem „Behälter mit dem meisten Wasser“ an, bei dem die größte Fläche zwischen zwei vertikalen Linien in einem Diagramm gesucht wird.
Suchen Sie anhand eines Arrays nicht negativer Ganzzahlen, die die Höhen vertikaler Linien darstellen, das Linienpaar, das zusammen mit der x-Achse den Container mit der größten Fläche bildet.
Betrachten Sie das Array height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
. Das Ziel besteht darin, zu bestimmen, welche zwei Linien die maximale Fläche erzeugen.
Die Technik verwendet zwei Zeiger, einen am Anfang und einen am Ende des Arrays, und bewegt sie iterativ in Richtung der Mitte, um die optimale Lösung zu finden.
Startup:
maxArea
wird auf 0 initialisiert und speichert den größten bisher gefundenen Bereich.l
(links) und r
(rechts), werden am Anfang bzw. Ende des Arrays positioniert.Iteration:
l
kleiner als r
ist.l
und r
wird als min(height[l], height[r]) * (r - l)
berechnet.maxArea
wird aktualisiert, wenn die berechnete Fläche größer ist.Bewegung der Zeiger:
height[l] < height[r]
, erhöhen Sie l
.r
.Rückgabe:
l
und r
sich schneiden, endet die Schleife und maxArea
enthält die maximale Fläche.Lassen Sie uns das Array analysieren height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
:
Startup:
maxArea = 0
l = 0
(Höhe 1), r = 8
(Höhe 7)Erste Iteration:
min(1, 7) * (8 - 0) = 8
maxArea = max(0, 8) = 8
l
(weil height[l] < height[r]
)Zweite Iteration:
l = 1
(Höhe 8), r = 8
(Höhe 7)min(8, 7) * (8 - 1) = 49
maxArea = max(8, 49) = 49
r
...und so weiter, wobei der Vorgang wiederholt wird, bis sich die Hände treffen.
Das Endergebnis wird maxArea = 49
sein.
Folgen Sie dem Go-Code, der die Technik implementiert:
package maxarea func maxArea(height []int) int { maxArea := 0 l, r := 0, len(height)-1 for l < r { area := min(height[l], height[r]) * (r - l) maxArea = max(maxArea, area) if height[l] < height[r] { l++ } else { r-- } } return maxArea } func min(a, b int) int { if a < b { return a } return b } func max(a, b int) int { if a > b { return a } return b }
Fazit
Die Zwei-Zeiger-Technik bietet eine effiziente Lösung für Probleme mit Arrays. Im Fall von „Container With Most Water“ garantiert es eine lineare Zeitkomplexität und ist somit ein idealer Ansatz.
Das obige ist der detaillierte Inhalt vonDie Zwei-Zeiger-Technik. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!