---
round: 2
ticket_no: 4
source_no: 17
slug: best-time-to-buy-and-sell-stock
topic: Greedy
difficulty: Easy
leetcode_id: 121
attempted: true
score: 2
verdict: partial
reviewed_at: 2026-09-12
---

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

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

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

```
Input:  prices = [7, 1, 5, 3, 6, 4]   →  Output: 5
Input:  prices = [7, 6, 4, 3, 1]      →  Output: 0
```

Ограничения: длина массива от 1 до 10^5, цены в диапазоне от 0 до 10^4.

## Ответ

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

## Разбор

**Что верно:** Ключевая идея (в раунде 1 ответа не было) найдена: один проход, запоминаем `min_price` (минимум из просмотренных, инициализация `+∞`) и `max_profit` (старт 0); для каждого дня прибыль = `price − min_price`, обновляем максимум. Инициализация бесконечностью названа верно.

**Что упущено и ошибки:** Не названа сложность по времени и памяти. Не названы граничные случаи (убывающий рынок → 0, один элемент, все цены равны). Мелкая оговорка «из текущего элемента высчитываем минимальную цену» — имелась в виду прибыль `price − min_price`, по контексту понятно.

**Эталонная идея:** один проход с двумя скалярами `min_price` и `max_profit`.

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

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

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