Состояние
current = max(value, current+value)
best = max(best, current)
Инициализируй первым элементом, чтобы обработать все отрицательные.
Лучший подмассив, заканчивающийся здесь: начать заново или продолжить предыдущий.
Минимальный синтаксис, который понадобится в решении.
current = max(value, current+value)
best = max(best, current)
Инициализируй первым элементом, чтобы обработать все отрицательные.
if value > current+value { start = i }
Дополнительные индексы восстанавливают сам диапазон.
Три идиоматичных решения на Go с оценкой времени и памяти.
Отрицательный накопленный префикс выгоднее отбросить.
O(n) time · O(1) spacefunc maxSubArray(nums []int) int {
current, best := nums[0], nums[0]
for _, n := range nums[1:] {
current = max(n, current+n)
best = max(best, current)
}
return best
}
Ответ — обычный максимум или total − минимум.
O(n) time · O(1) spacefunc maxSubarraySumCircular(nums []int) int {
total, maxEnd, maxSum := nums[0], nums[0], nums[0]
minEnd, minSum := nums[0], nums[0]
for _, n := range nums[1:] {
total += n
maxEnd = max(n, maxEnd+n); maxSum = max(maxSum, maxEnd)
minEnd = min(n, minEnd+n); minSum = min(minSum, minEnd)
}
if maxSum < 0 { return maxSum }
return max(maxSum, total-minSum)
}
Минимальная цена прошлого играет роль лучшего отрицательного префикса.
O(n) time · O(1) spacefunc maxProfit(prices []int) int {
cheapest, profit := prices[0], 0
for _, price := range prices[1:] {
profit = max(profit, price-cheapest)
cheapest = min(cheapest, price)
}
return profit
}