Сложность: medium
Дан массив prices, где prices[i] — цена данной акции в i-й день.
Найдите максимальную прибыль, которую можно получить. Вы можете совершить любое количество транзакций (т. е. купить и продать одну акцию несколько раз) с следующими ограничениями:
После продажи акции вы не можете покупать акции на следующий день (т. е. необходимо один день подождать).
Пример:
Input: prices = [1]
Output: 0
👨💻 Алгоритм:
1⃣Инициализация состояний
Используйте три состояния для отслеживания максимальной прибыли: hold: максимальная прибыль на данный день, если у вас есть акция. sold: максимальная прибыль на данный день, если вы продали акцию. cooldown: максимальная прибыль на данный день, если вы находитесь в периоде ожидания после продажи.
2⃣Обновление состояний
Итерируйте по каждому дню, обновляя состояния: hold: максимальная прибыль, если у вас есть акция на текущий день. sold: максимальная прибыль, если вы продаете акцию на текущий день. cooldown: максимальная прибыль, если вы находитесь в периоде ожидания на текущий день.
3⃣Определение максимальной прибыли
В конце итерации максимальная прибыль будет максимальным значением между состояниями sold и cooldown, так как hold состояние не может быть конечным состоянием для получения максимальной прибыли.
😎 Решение:
class Solution {
function maxProfit($prices) {
if (empty($prices)) return 0;
$hold = -$prices[0];
$sold = 0;
$cooldown = 0;
for ($i = 1; $i < count($prices); $i++) {
$newHold = max($hold, $cooldown - $prices[$i]);
$newSold = $hold + $prices[$i];
$newCooldown = max($cooldown, $sold);
$hold = $newHold;
$sold = $newSold;
$cooldown = $newCooldown;
}
return max($sold, $cooldown);
}
}Ставь 👍 и забирай 📚 Базу знаний