---
round: 1
ticket_no: 21
source_no: 19
slug: best-time-to-buy-and-sell-stock-with-transaction-fee
topic: Greedy
difficulty: Medium
leetcode_id: 714
attempted: true
score: 2
verdict: partial
reviewed_at: 2026-09-12
---

# Билет 21 — Best Time to Buy and Sell Stock with Transaction Fee

## Условие (как предъявлено)

Дан массив `prices`, где `prices[i]` — цена акции в день `i`, и целое число `fee` — комиссия за каждую транзакцию. Можно совершать сколько угодно транзакций, но не более одной акции одновременно; с каждой транзакции платится `fee`. Вернуть максимальную прибыль.

```
Input:  prices = [1,3,2,8,4,9], fee = 2  →  8
        (купить 1, продать 8, минус комиссия 2 → +5;
         купить 4, продать 9, минус комиссия 2 → +3; итого 8)
```

Constraints: `1 <= n <= 5*10^4`, `1 <= prices[i] < 5*10^4`, `0 <= fee < 5*10^4`.

## Ответ

> Значит, здесь у нас получается. Мы также фиксируем кандидатов на покупку, то есть, первое — начало на состояние должно быть. У нас есть акции или у нас нет акций, вот, значит, ищем начало кандидата на покупку. Вот. И, значит, если у нас, ну, то есть первая единичка, второй у нас, если всё ещё бывает, то мы передвигаем кандидат на покупку. Если начинает нарастать, он начинает с кандидата на продажу. Мы сравниваем выгоду, смотрим, сколько у нас с этим с налогом, вот получается, лучше не стало, да, тогда мы пока ещё в состоянии продажи. То есть мы его ещё не продали. Вот, то есть, мы как будто сделку ещё она у нас подвисла. Дальше ищем, двоечка является ли она лучшим кандидатом на покупку или на продажу, то есть, оно у нас получается. Ладно, всё ещё мы в продаже находимся, восьмерка получаем, восьмерка у нас уже хороший кандидат на продажу. У нас уже выгода есть, дальше смотрим четвёрку. Всё, оно уменьшение. Значит, это новый кандидат. То есть, сделку мы закрепляем, её записываем, что эта сделка совершена. Записываем с какой это фи. И идём дальше. Вот, значит, теперь у нас нету ничего. Мы ищем снова андидата на покупку.

## Разбор

**Что верно:** два состояния (есть акция / нет акции), кандидаты на покупку и продажу, накопление прибыли, вычитание комиссии при закрытии сделки — направление верное, самая сложная из серии про акции.

**Что упущено и ошибки:** логика «плавает»: не сформулированы точно состояния cash / hold и место вычитания комиссии; не названа сложность O(n) / O(1); граничные случаи (n = 1, fee больше любой разницы → 0) не разобраны.

**Эталонная идея:** cash = 0, hold = -prices[0]; prices.each { |p| cash = [cash, hold + p - fee].max; hold = [hold, cash - p].max }; ответ cash.

**Сложность:** время O(n), память O(1)

**Критерии:** идея ⚠️ · структура данных ✅ · сложность ❌ · граничные случаи ⚠️


**Разбор задачи:** [`../../algo-solutions/01-must-have/07-greedy/19-best-time-to-buy-and-sell-stock-with-transaction-fee.md`](../../algo-solutions/01-must-have/07-greedy/19-best-time-to-buy-and-sell-stock-with-transaction-fee.md)
