Разбор задачи: Лучшее время для покупки и продажи акции

Предложенный нами код решения:

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.

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии