Я вижу много алгоритмических проблем, которые всегда сводятся к чему-то длинному:
У вас есть целочисленный массив , вам нужно найти такое, что максимизирует за времени.
Очевидно, что временное решение состоит в том, чтобы рассмотреть все пары, однако есть ли способ максимизировать выражение в не зная ничего о свойствах ?
Одна идея, о которой я подумал, это исправить , тогда нам нужно найти от до , равный или и поскольку фиксировано, нам нужно .
Тем не менее, я не вижу способа избавиться от зависимых терминов внутри. Любая помощь?
algorithms
algorithm-analysis
optimization
AspiringMat
источник
источник
Ответы:
Это решениеO(nlogn) . O ( п ) решение указывало Willard Zhan добавляются в последнем из этого ответа.O(n)
Для удобства обозначим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<j h [ 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я < j h [ i ] < h [ j ] U LU≤ я 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 .
Обозначим , имеем следующую лемму.v(u)=argmaxv: lu<rvf(lu,rv)
источник