Ich sehe viele algorithmische Probleme, die die Zeilen von:
Sie haben ein ganzzahliges Array , Sie müssen so finden, dass in Zeit maximiert wird.
Offensichtlich besteht die -Zeitlösung darin, alle Paare zu berücksichtigen. Gibt es jedoch eine Möglichkeit, den Ausdruck in zu maximieren, ohne etwas anderes über die Eigenschaften von zu wissen ?
Eine Idee, an die ich gedacht habe, ist, zu reparieren , dann müssen wir von bis , das gleich oder und da fest ist, brauchen wir .
Ich sehe jedoch keine Möglichkeit, die darin enthaltenen abhängigen Begriffe loszuwerden . Irgendeine Hilfe?
algorithms
algorithm-analysis
optimization
AspiringMat
quelle
quelle
Antworten:
Dies ist eine -Lösung. Eine O ( n ) -Lösung, auf die Willard Zhan hingewiesen hat, ist am Ende dieser Antwort angehängt.O(nlogn) O(n)
LösungO(nlogn)
Bezeichnen Sie aus Gründen der Übersichtlichkeit .f(i,j)=(h[j]−h[i])(j−i)
Definiere und l i sei der kleinste Index, so dass l i > l i - 1 und h [ l i ] < h [ l i - 1 ] . In ähnlicher Weise definieren Sie r 1 = n und r i ist der größte Index, so dass r i < r i - 1 und h [ r i ] >l1=1 li li>li−1 h[li]<h[li−1] r1=n ri ri<ri−1 . Die Sequenzen l 1 , l 2 , . . . und r 1 , r 2 , … sind in O ( n ) Zeitleicht zu berechnen.h [ rich] > h [ ri - 1]] l1, l2, . . . r1, r2, … O ( n )
Der Fall, in dem es kein so dass h [ i ] < h [ j ] (dh f ( i , j ) > 0 ) ist trivial. Wir konzentrieren uns jetzt auf nicht triviale Fälle. In solchen Fällen müssen wir nur solche Paare berücksichtigen, um die Lösung zu finden.i < j h [ i ] < h [ j ] f( i , j ) > 0
Für jedes , so daß h [ i ] < H [ j ] , lassen u der größte Index derart sein , dass L u ≤ i und v , den kleinsten Index derart , dass r v ≥ j , dann h [ l u ] ≤ h [ i ] (ansonsten l u + 1 ≤ i per Definition von l u + 1i < j h [ i ] < h [ j ] u lu≤ i v rv≥ j h [ lu] ≤ h [ i ] lu + 1≤ i lu + 1 widerspricht somit der Definition von ) und in ähnlicher Weise h [ r v ] ≥ h [ j ] . Daher
( h [ r v ] - h [ l u ] ) ( R V - L u ) ≥ ( h [ j ] - H [ i ] ) ( R v - l u ) ≥ ( h [u h [ rv] ≥ h [ j ]
Das heißtwir müssen nur Paare betrachten ( L u , R v ) wobei l u < r v .
Bezeichne , haben wir das folgende Lemma.v ( u ) = argmaxv : l u< rvf( lu, rv)
quelle