Verwenden wir , um den Anfang eines Segments zu bezeichnen, und , um das Ende zu bezeichnen. Erstellen Sie für jedes Segment zwei Paare, eines für jeden Endpunkt:+- -
Segment1: (-2, +), (3, -)
Segment2: (1, +), (5, -)
Segment3: (-3, +), (1, -)
Sortieren Sie die 2 N.Paare nach ihrer ersten Koordinate (bei Gleichheit + vor - setzen). Sie können dies rechtzeitig tunO ( N.LogN.) mit jedem vernünftigen Sortieralgorithmus oder rechtzeitig O ( N.+ K.)Verwenden der schlüsselindizierten Zählung . Im Beispiel erhalten wir:
(-3, +)
(-2, +)
(1, +)
(1, -)
(3, -)
(5, -)
Verarbeiten Sie nun die Endpunkte der Reihe nach. Behalten Sie die Anzahl der aktiven Segmente bei, die anfänglich 0 ist. Jedes Mal, wenn Sie a verarbeiten+Erhöhen Sie die Anzahl um 1. Jedes Mal, wenn Sie a verarbeiten - -Verringern Sie die Anzahl um 1. Überprüfen Sie nach der Verarbeitung jedes Endpunkts, ob die neue Anzahl höher ist als die bisher größte Anzahl. Wenn dies der Fall ist, aktualisieren Sie Ihre Lösung.
(-3, +) -> count=1, max_count=0, sol=-3
(-2, +) -> count=2, max_count=1, sol=-2
(1, +) -> count=3, max_count=2, sol=1
(1, -) -> count=2, max_count=3, sol=1
(3, -) -> count=1, max_count=3, sol=1
(5, -) -> count=0, max_count=3, sol=1
Diese zweite Phase des Algorithmus dauert zeitproportional N.. Der gesamte Algorithmus braucht ZeitO ( N.LogN.) mit einer generischen Sorte oder O ( N.+ K.) mit schlüsselindizierter Zählung.
Erstellen wir ein Array der Größe 2 * k + 1, das alle mit 0 initialisiert ist. Für jedes Segment der Form [L, R] addieren wir 1 zum L- ten Index und subtrahieren 1 vom R + 1- ten Index.
Um das Ergebnis zu erhalten, führen wir eine Präfixsumme durch.
Sei ich der Index mit dem Maximalwert. Dann lautet die Antwort iK .
Lösen wir das gestellte Beispiel:
Die zeitliche Komplexität des obigen Ansatzes beträgt O (max (N, K)) .
quelle