Я читал книгу «Программирование жемчуга» и застрял в каком-то месте.(Лучшее) оригинальное решение проблемы (поиск подмассива с максимальной суммой):
maxsofar = О
maxendinghere = О
for i = [0. n)
{
maxendinghere = max(maxendinghere + x[i], 0)
maxsofar = max(maxsofar, maxendinghere)
}
Затем проблема изменяется следующим образом, и программа запрашивается изменение:
Вместо того, чтобы находить подмассив с максимальной суммой, мы должны найти подмассив с ближайшей к нулю суммой ( не минимум) или каким-либо другим числом f .
- Так что я бы решил эту проблему, просто изменив функцию " max " на некоторую функцию, которая будет возвращать число, которое ближе к нулю (или f).
- maxsofar будет инициализирован элементом, ближайшим к нулю (или f)
Это решение работает в O (n), но автор дает решение, которое сложно и работает вO (nlogn) и утверждает, что это оптимальное решение (теоретически наилучшее из возможных).
Пожалуйста, не могли бы вы указать на ошибку в моем решении (если книга говорит, что nlogn является лучшим, то в моем решении должны быть некоторые ошибки).
ОБНОВЛЕНИЕ: Итак, мой ответ будет:
closest = get_element_closest_to_zero();
maxsofar = closest;
maxendinghere = 0;
for i = [0. n)
{
maxendinghere = closest_to_zero(maxendinghere + x[i], closest);
maxsofar = closest_to_zero(maxsofar, maxendinghere) ;
}
Спасибо.