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=1lili>li−1h[li]<h[li−1]r1=nriri<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 < jh [ 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 < jh [ i ] < h [ j ]ulu≤ ivrv≥ jh [ lu] ≤ h [ i ]lu + 1≤ ilu + 1widerspricht 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 [uh [ rv] ≥ h [ j ]
Das heißtwir müssen nur Paare betrachten ( L u , R v ) wobei l u < r v .
( h [ rv] - h [ lu] ) ( rv- lu) ≥ ( h [ j ] - h [ i ] ) ( rv- lu) ≥ ( h [ j ] - h [ i ] ) ( j - i ) .
( lu,rv)lu< rv
Bezeichne , haben wir das folgende Lemma.v ( u ) = argmaxv : l u< rvf( lu, rv)
Ein Paar wobei l u < r v , und wo es vorhanden ist u 0 , so dass u < u 0 und v < v ( u 0 ) oder derart , dass u > u 0 und v > v ( u 0 ) kann keine endgültige optimale Lösung sein.( lu, rv)lu< rvu0u < u0v < v ( u0)u > u0v > v ( u0)
Beweis. Nach der Definition von , haben wir
( h [ r v ( u 0 ) ] - h [ l u 0 ] ) ( r v ( u 0 ) - l u 0 ) ≥ ( h [ r v ] - h [ l u 0 ] ) ( R V - Lv ( u0)
oder
(h[rv]-h[r v ( u 0 ) ])l u 0 +h[l u 0 ](rv-r v ( u 0 ) )+h[r v ( u 0 ) ]r v ( u 0 ) -
( h [ rv ( u0)] - h [ lu0] ) ( rv ( u0)- lu0) ≥ ( h [ rv] - h [ lu0] ) ( rv- lu0) ,
( h [ rv] - h [ rv ( u0)] ) lu0+ h [ lu0] ( rv- rv ( u0)) + h [ rv ( u0)] rv ( u0)- h [ rv] rv ( u0)≥ 0.
In dem Fall, in dem und v < v ( u 0 ) sind , notieren Sie h [ r v ] - h [ r v ( u 0 ) ] < 0 und r v - r v ( u 0 ) > 0 und auch l u < l u 0 und h [ l u ] > hu < u0v < v ( u0)h [ rv] - h [ rv ( u0)] < 0rv- rv ( u0)> 0lu< lu0 , haben wir
h [ lu] > h [ lu0]]
> ( h [ rv] - h [ rv ( u0)] ) lu+ h [ lu] ( rv- rv ( u0))( h [ rv] - h [ rv ( u0)] ) lu0+ h [ lu0] ( rv- rv ( u0)) .
( h [rv] - h [ rv (u0)] )lu+ h [lu] (rv- rv (u0)) + h [ rv (u0)] rv (u0)- h [rv] rv (u0)> 0 ,
( h [ rv ( u0)] - h [ lu] ) ( rv ( u0)- lu) > ( h [ rv] - h [ lu] ) ( rv- lu) .
(lu, rv (u0))( lu, rv)■
v ( ℓ / 2 )ℓl1, l2, …Ö1( lu, rv)u = 1 , … , ℓ / 2 - 1v = v ( ℓ / 2 ) , v ( ℓ / 2 ) + 1 , …Ö2( lu, rv)u = ℓ / 2 + 1 , ℓ / 2 + 2 , …v = 1 , … , v ( ℓ / 2 ){ ( lℓ / 2, rv ( ℓ / 2 )) , o1, o2}}
O ( n )
f( lu, rv) = - ∞lu≥ rvu >u0v > v0f( lu0, rv0) ≥ f( lu0, rv)f( lu, rv0) > f( lu, rv)M.[ x , y] : = - f( lx, rc - y+ 1)cr1, r2, …rc - y+ 1yM.f