LeetCode 300 — Longest Increasing Subsequence

Undécimo problema de DP 1-D. LIS clásico. DP O(n²) o patience sorting con binary search O(n log n).

Enunciado

Devuelve la longitud de la subsecuencia (no contigua) estrictamente creciente más larga.


Solución 1 — DP O(n²)

class Solution:
    def lengthOfLIS(self, nums):
        dp = [1] * len(nums)
        for i in range(1, len(nums)):
            for j in range(i):
                if nums[j] < nums[i]:
                    dp[i] = max(dp[i], dp[j] + 1)
        return max(dp)

Análisis: O(n²).


Solución 2 — Patience sorting + binary search O(n log n)

from bisect import bisect_left
class Solution:
    def lengthOfLIS(self, nums):
        sub = []
        for n in nums:
            i = bisect_left(sub, n)
            if i == len(sub):
                sub.append(n)
            else:
                sub[i] = n                       # reemplazar
        return len(sub)

Análisis: O(n log n). sub no es la subsecuencia real, pero su longitud sí lo es.


Conexiones

Estado

  • Leído
  • Implementadas ambas soluciones
  • Resuelto en LeetCode