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.