Это решение O(nlogn) . O ( п ) решение указывало Willard Zhan добавляются в последнем из этого ответа.O(n)
O(nlogn) решение
Для удобства обозначим f(i,j)=(h[j]−h[i])(j−i) .
Определите l1=1 , и li будет наименьшим индексом, так что li>li−1 и h[li]<h[li−1] . Аналогично, определите r1=n , и ri будет наибольшим индексом, так что ri<ri−1 и h[ri]>h[ri−1] . Последовательностиl1,l2,...иr1,r2,… легко вычислить заO(n) время.
Случай, когда нет такого, что h [ i ] < h [ j ] (т. Е. F ( i , j ) > 0 ), тривиален. Теперь сосредоточимся на нетривиальных случаях. В таких случаях, чтобы найти решение, нам нужно только рассмотреть такие пары.i<jh [ i ] < h [ j ]е( i , j ) > 0
Для каждого такого, что h [ i ] < h [ j ] , пусть u будет наибольшим индексом, таким, что l u ≤ i , и v будет наименьшим индексом, таким, что r v ≥ j , тогда h [ l u ] ≤ h [ i ] (иначе l u + 1 ≤ i по определению l u + 1я < jh [ i ] < h [ j ]ULU≤ яvрv≥ jч [ лU] ≤ h [ i ]Lты + 1≤ яLты + 1Таким образом, противоречит определению ), и аналогично h [ r v ] ≥ h [ j ] . Следовательно
( ч [ г V ] - ч [ л у ] ) ( г V - л U ) ≥ ( ч [ J ] - ч [ я ] ) ( г V - л у ) ≥ ( ч [Uч [ рv] ≥ h [ j ]
Это означает, что нам нужно рассматривать только пары ( l u , r v ), где 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
Обозначим , имеем следующую лемму.v(u)=argmaxv: lu<rvf(lu,rv)
Пара где l u < r v и где существует u 0, такое что u < u 0 и v < v ( u 0 ) или такое, что u > u 0 и v > v ( u 0 ) , не может быть окончательным оптимальным решением.(lu,rv)lu<rvu0u<u0V < V ( U0)ты > ты0v > v ( ты0)
Доказательство. Согласно определению , мы имеем
( 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 ( ты0)
или
(ч[гV]-ч[г V ( U 0 ) ])л у 0 +ч[л у 0 ](гV-г V ( U 0 ) )+ч[г V ( U 0 ) ]r v ( u 0 ) -
( ч [ рv ( ты0)] - ч [ лU0] ) ( гv ( ты0)- лU0) ≥ ( ч [ рv] - ч [ лU0] ) ( гv- лU0) ,
( ч [ рv] - ч [ рv ( ты0)] ) лU0+ ч [ лU0] ( гv- гv ( ты0)) + ч [ рv ( ты0)] гv ( ты0)- ч [ рv] гv ( ты0)≥ 0.
В случае, когда и v < v ( u 0 ) , заметим, что h [ r v ] - h [ r v ( u 0 ) ] < 0 и r v - r v ( u 0 ) > 0 , а также l u < l u 0 и h [ l u ] > hты < ты0V < V ( U0)ч [ рv] - ч [ рv ( ты0)] < 0рv- гv ( ты0)> 0LU< лU0 , мы имеем
ч [ лU] > ч [ лU0]
> ( ч [ рv] - ч [ рv ( ты0)] ) лU+ ч [ лU] ( гv- гv ( ты0))( ч [ рv] - ч [ рv ( ты0)] ) лU0+ ч [ лU0] ( гv- гv ( ты0)) .
( ч [ рv] - ч [ рv ( ты0)] ) лU+ ч [ лU] ( гv- гv ( ты0)) + ч [ рv ( ты0)] гv ( ты0)- ч [ рv] гv ( ты0)> 0 ,
( ч [ рv ( ты0)] - ч [ лU] ) ( гv ( ты0)- лU) > ( ч [ рv] - ч [ лU] ) ( гv- лU) .
( лU, гv ( ты0))( лU, гv)■
V ( ℓ / 2 )ℓL1, л2, ...о1( лU, гv)u = 1 , … , ℓ / 2 - 1v = v ( ℓ / 2 ) , v ( ℓ / 2 ) + 1 , …о2( лU, гv)и = ℓ / 2 + 1 , ℓ / 2 + 2 , …v = 1 , … , v ( ℓ / 2 ){ ( лℓ / 2, гV ( ℓ / 2 )) , о1, о2}
O ( n )
е( лU, гv) = - ∞LU≥ гvты > ты0v > v0е( лU0, гv0) ≥ f( лU0, гv)е( лU, гv0) > f( лU, гv)M[ х , у] : = - f( лИкс, гс - у+ 1)ср1, г2, ...рс - у+ 1YMе