Mejor Momento para Comprar y Vender

Este problema consiste en encontrar la máxima diferencia entre un mínimo y un máximo que aparezca después de ese mínimo.

Yo primero lo intenté por fuerza bruta, probando cada posibilidad hasta obtener la mayor, haciendo de mi solución O(N^2) y volviéndola bastante lenta.

Solución


 def solución(self, nums):
     max=0
     for i in range(len(nums)):
       for j in nums[i:]:
         if j-nums[i]>max:
             max=j-nums[i]
    return max

La solución recorre cada posible punto de compra y, para cada uno, revisa todos los días posteriores buscando la mayor ganancia.

Una mejor solución usa dos punteros y no necesita comparar todos los pares:

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        left = 0
        right = 1
        max_prof = 0
        cur_prof = 0

        while right < len(prices) :
            cur_prof = prices[right] - prices[left]
            if prices[right] - prices[right-1] > cur_prof:
                left = right-1
                continue
            max_prof = max(cur_prof, max_prof)
            right+=1

        return max_prof

Se mantiene un puntero left al mejor precio de compra y un puntero right que avanza. Si la ganancia usando el día anterior como compra es mayor, se mueve left a right-1. En caso contrario se actualiza la ganancia máxima. Así se recorre el arreglo una sola vez.