Программа курса:
Разбор задачи: Лучшее время для покупки и продажи акции
Предложенный нами код решения:
def max_profit(prices):
"""
Вычисляет максимальную прибыль от покупки и продажи акций.
:param prices: Список цен акций по дням.
:return: Максимальная возможная прибыль или 0, если прибыль невозможна.
"""
if not prices or len(prices) < 2:
return 0
min_price = float('inf') # Инициализируем минимальную цену
max_profit = 0 # Инициализируем максимальную прибыль
for price in prices:
if price < min_price:
min_price = price # Обновляем минимальную цену
elif price - min_price > max_profit:
max_profit = price - min_price # Обновляем максимальную прибыль
return max_profitФункция max_profit(prices) решает задачу поиска максимальной прибыли от покупки и продажи акции, где список prices представляет собой последовательность цен акций по дням. Задача заключается в том, чтобы выбрать день для покупки и день для продажи таким образом, чтобы максимизировать прибыль. Если такая сделка невозможна (например, если цены только падают), функция должна вернуть 0.
1. Параметры
Функция принимает один параметр:
prices: Список целых чисел, где каждое число представляет собой цену акции в конкретный день. Например,prices = [7, 1, 5, 3, 6, 4]— это цены на акции за 6 дней.
2. Логика работы функции
Проверка на валидность данных
if not prices or len(prices) < 2:
return 0
- Если список
pricesпустой или содержит меньше двух элементов (невозможно совершить сделку, если нет хотя бы двух дней), функция сразу возвращает 0. Это базовая проверка для избежания дальнейших вычислений в случае непригодных данных.
Инициализация переменных
min_price = float('inf') # Инициализируем минимальную цену
max_profit = 0 # Инициализируем максимальную прибыль
min_price: переменная для хранения минимальной цены, с которой можно будет купить акцию. Изначально она установлена в бесконечность (float('inf')), чтобы любой элемент списка оказался меньше этого значения на первой итерации.max_profit: переменная для хранения максимальной прибыли. Начинаем с 0, потому что если на всех днях акции только падают, то прибыли не будет.
Основной цикл
for price in prices:
if price < min_price:
min_price = price # Обновляем минимальную цену
elif price - min_price > max_profit:
max_profit = price - min_price # Обновляем максимальную прибыль
- Этот цикл проходит по всем ценам акций в списке
prices:- Если текущая цена меньше минимальной цены, это означает, что мы нашли новый более выгодный день для покупки, и мы обновляем
min_price. - Если текущая цена минус минимальная цена больше текущей максимальной прибыли, это значит, что мы можем получить большую прибыль, если купим акцию за
min_priceи продадим её по текущей цене. В этом случае мы обновляемmax_profit.
- Если текущая цена меньше минимальной цены, это означает, что мы нашли новый более выгодный день для покупки, и мы обновляем
Возврат результата
return max_profit
- После завершения цикла, функция возвращает максимальную прибыль, которая была найдена.
3. Пример работы функции
Рассмотрим пример:
prices = [7, 1, 5, 3, 6, 4]
result = max_profit(prices)
- Изначально
min_price = inf,max_profit = 0. - Проходим по ценам:
- На первом шаге (цена 7), минимальная цена обновляется до 7.
- На втором шаге (цена 1), минимальная цена обновляется до 1.
- На третьем шаге (цена 5), прибыль при продаже на этом шаге составит
5 - 1 = 4. Максимальная прибыль обновляется на 4. - На четвертом шаге (цена 3), прибыль
3 - 1 = 2, максимальная прибыль остается 4. - На пятом шаге (цена 6), прибыль
6 - 1 = 5. Максимальная прибыль обновляется на 5. - На шестом шаге (цена 4), прибыль
4 - 1 = 3, максимальная прибыль остается 5.
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии