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

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

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

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

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

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

## Ответ

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

## Разбор

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

**Что упущено и ошибки:** ответ на этот вопрос не найден. Он в одной переменной: min_price — минимум всех просмотренных цен, и на каждом дне прибыль = price − min_price; новая лучшая цена покупки сама опускает min_price, а max_profit фиксирует лучший день продажи. Сложность и граничные случаи не названы.

**Эталонная идея:** min_price = Float::INFINITY; profit = 0; prices.each { |p| profit = [profit, p - min_price].max; min_price = [min_price, p].min }.

**Сложность:** время 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)
