---
round: 1
ticket_no: 16
source_no: 18
slug: best-time-to-buy-and-sell-stock-ii
topic: Greedy
difficulty: Medium
leetcode_id: 122
attempted: true
score: 2
verdict: partial
reviewed_at: 2026-09-12
---

# Билет 16 — Best Time to Buy and Sell Stock II

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

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

```
Input:  prices = [7,1,5,3,6,4]  →  7
        (купить на день 2 за 1, продать на день 3 за 5, +4;
         купить на день 4 за 3, продать на день 5 за 6, +3; итого 7)
Input:  prices = [1,2,3,4,5]    →  4
Input:  prices = [7,6,4,3,1]    →  0
```

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

## Ответ

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

## Разбор

**Что верно:** машина состояний «есть акция / нет акции», покупка на локальном минимуме, продажа на локальном максимуме, накопление прибыли — результат эквивалентен эталону.

**Что упущено и ошибки:** не назван короткий инсайт, который и ждут на интервью: прибыль равна сумме всех положительных перепадов prices[i] − prices[i-1]. Не названы сложность O(n) / O(1) и граничные случаи (убывающий массив → 0, n = 1).

**Эталонная идея:** prices.each_cons(2).sum { |a, b| [b - a, 0].max }.

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

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


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