Вы можете найти проблему LeetCode Здесь Анкет
Вопрос:
Скажем, у вас есть массив, для которого элемент ITH является ценой данной акции в день I.
Если вам было разрешено завершить не более одной транзакции (то есть купить одну и продать одну акцию), разработать алгоритм, чтобы найти максимальную прибыль.
Обратите внимание, что вы не можете продать акцию, прежде чем купить ее.
Пример 1: Вход: [7,1,5,3,6,4] Вывод: 5 Объяснение: купить в день 2) и продавать в день 5),-1. Нет, так как цена продажи должна быть больше, чем цена покупки.
Пример 2: Ввод: [7,6,4,3,1] Вывод: 0 Объяснение: В этом случае транзакция не проводится, то есть макс.
Решение грубой силы:
Я бы использовал вложенную для цикла, чтобы сравнить число, а другие цифры справа от него, чтобы найти максимальную прибыль.
def maxProfit(prices): max_profit = 0 for earlier_price in range(len(prices)): for later_price in range(earlier_price + 1, len(prices)): if profit < prices[later_price] - prices[earlier_price]: max_profit = prices[later_price] - prices[earlier_price] return max_profit
Я обновляю MAX_PROFIT всякий раз, когда нахожу прибыль, которая больше. Для моих петлей я не хочу считать числа слева от eariler_price, и я не хочу дважды считать eariler_price. Чтобы предотвратить это, я увеличил начальный диапазон на 1 (более раннее_Прис + 1).
Если вы скопируете и вставите это решение в LeetCode, он даст вам время, потому что этот алгоритм работает во время O (n^2) и O (1) пространство. Мы по существу зацикливаемся на один раз по каждому номеру, когда все остальные числа.
Оптимальное решение:
Мы будем отслеживать MAX_PROFIT и минимальное число, которое мы видели до сих пор. Мы собираемся пройти через каждое число в списке и посмотреть, есть ли более низкий номер, чем наш минимум. Если есть, мы переназнаем минимальный_Нем. Мы также решаем, остается ли MAX_PROFIT неизменной или переназначим ее с нашей новой рассчитанной прибылью. Этот алгоритм не делает новое пространство и проходит только один раз.
def maxProfit(prices): max_profit = 0 minimum_num = 100000 for num in prices: if num < minimum_num: minimum_num = num max_profit = max(max_profit, num - minimum_num) return max_profit
Вам может быть интересно, почему наш минимум настолько высок? Откуда вы взяли этот номер? Это очень высокое число, которое я установил, потому что если бы я установил минимум_Не 0, то в нашем списке он может быть ниже, чем что -либо. Вы также можете установить Minimum_Num на первый номер в списке. Минимальный_Нем, скорее всего, будет заменен в первой итерации нашей петли.
max_profit = max(max_profit, num - minimum_num)
Я считаю, что это самый важный шаг в этом алгоритме, потому что именно там вы решаете, обновлять ли MAX_PROFIT или нет.
Вывод
Этот алгоритм использует жадный подход, в котором говорится, что у нас будет переменная/переменные, которые мы будем обновлять, поскольку мы найдем что -то лучше.
Спасибо за чтение!
Оригинал: “https://dev.to/jolouie7/best-time-to-buy-and-sell-stock-in-python-3pk7”