Рубрики
Без рубрики

Лецкод сентября день18.

Проблема – скажем, у вас есть массив, для которого ITH Element является ценой данного запаса в день я …. Теги с Python, информатики.

Проблема –

Скажем, у вас есть массив, для которого ITH Element – это цена данного запаса в день I.

Если вам разрешено только получить только одну транзакцию (то есть, купите один и продаем одну долю акций), разработайте алгоритм, чтобы найти максимальную прибыль.

Обратите внимание, что вы не можете продать акции, прежде чем купить один.

Пример “” “Вход: [7,1,5,36,4] Вывод: 5 Объяснение: Купить в день 2) и продать в день 5), – 1. Нет, так как цена продажи должна быть больше, чем цена покупки. ” “” Решение

Подход – с использованием дека. Использование DECE, чтобы отслеживать максимальную цену справа. Затем мы повторяемся снова и обновляем максимальную прибыль. (log n)

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        # we can use stack based approach
        stack = []
        ans = [0] * len(prices)
        for i in range(len(prices)-1, -1, -1):
            if i == len(prices)-1:
                stack.append(prices[i])
                continue
            while True:
                if prices[i] > stack[-1]:
                    stack.pop()
                    if len(stack) == 0:
                        stack.append(prices[i])
                        ans[i] = prices[i]
                        break
                else:
                    stack.append(prices[i])
                    ans[i] = stack[0]
                    break
        res = 0
        for a, m in zip(ans, prices):
            res = max(res, a - m)
        return res   

Мы все еще можем оптимизировать этот подход. Для каждого меньшего элемента мы заинтересованы в больших элементах справа. Итак, хотя и итация массива, мы можем прибыть двумя возможностями –

  1. Новый элемент больше нашего ente_min, в этом случае мы обновляем наш max_profit.
  2. Новый элемент меньше нашего ente_min, в этом случае мы обновляем наш текущий_min. Решение
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        current_min = float('inf')
        max_profit = 0
        for price in prices:
            if price < current_min:
                current_min = price
            else:
                max_profit = max(max_profit, price - current_min)
        return max_profit

Редактировать – пытался повеселиться и придумал этот бейнер

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        return reduce(lambda p,c: (max(p[0], c - p[-1]) , min(p[-1], c)) if type(p) == type((1,2,)) else (0, c), [0] + prices)[0] if prices else 0

Оригинал: “https://dev.to/skbhagat40/leetcode-september-day18-273i”