Как найти максимальную сумму, которую можно получить сложением произвольной неразрывной последовательности элементов массива?
Задачка была следующая - дан массив длинной до 200, 000 элементов, элементами которого являются целые числа в диапазоне [-10000, 10000].
Нужно найти максимальную сумму, которую можно получить сложением произвольной неразрывной последовательности элементов этого массива.
Типа для входных данных [2,-2,-5,2,2,-1,2,-3] будет 5 - сумма подмассива [2,2,-1,2]
Я в алгоритмах не силен, но вроде как нащупал верный, правда забыл про смешное граничное условие и не успел закончить вовремя.
Как бы вы стали решать эту задачу?
В условии также есть ограничение по времени выполнения алгоритма - не более 2-х секунд в их интерпретаторе.
Задача решается за линейное время. Будем поддерживать текущую сумму sum некоторой части массива. Ответ храним в переменной ans. Теперь сам алгоритм.
1. Проходим по массиву и обновляем текущую сумму sum.
2. Если в какой-то момент сумма sum стала отрицательной, то обнуляем ее: sum = 0.
3. В каждый момент времени обновляем ответ ans = max{ ans, sum }.
Можно доказать, что приведенный алгоритм корректно решает задачу.
@brevis А если запретить пустую подпоследовательность, то для вашего случая будет sum([-1]) = -1, что тоже больше -3. Для всего массива максимальной суммой при наличии только отрицательных чисел тогда будет максимальное из этих чисел.
Кстати, алгоритм при этом почти не меняется. Достаточно в том же цикле найти максимальный элемент массива (maxVal), и в конце алгоритма, если maxVal < 0, то ans = maxVal.
var a = [], // Array
i = 0, x,
current = a[0] + a[1],
max = current;
for (i = 0; i in a; i++) {
current = a[i];
for (x = i + 1; x in a; x++) {
current = current + a[x];
if (current > max) {
max = current;
}
}
}
console.log('Result:', max);
Только алгоритм ошибочный. На примере из вопроса выдаёт не 5, а 4. Ошибка в том, что уменьшение current (current + a[x] < current) не означает, что подпоследовательность закончилась.
@lomatek Но ведь не сказано, что массив не может быть пустым или состоять из одного элемента. Да и сумма вполне определена для одноэлементных (sum([x]) = x) и пустых (sum([]) = 0) множеств.