Menu iconMenu icon
Introducción a los Algoritmos

Capítulo 8: Estructuras de Datos Utilizadas en Algoritmos

8.5 Problemas de práctica

Problema 1: Arrays - Suma máxima de subarreglo

Problema: Dado un array de enteros nums, encuentra el subarreglo contiguo (que contenga al menos un número) que tenga la suma más grande y devuelve su suma.

Solución: Podemos resolver este problema utilizando el algoritmo de Kadane. Aquí tienes un código en Python para este problema.

def max_subarray(nums):
    if not nums:
        return 0

    curr_sum = max_sum = nums[0]

    for num in nums[1:]:
        curr_sum = max(num, curr_sum + num)
        max_sum = max(max_sum, curr_sum)

    return max_sum

print(max_subarray([-2,1,-3,4,-1,2,1,-5,4]))  # output: 6

Problema 2: Listas enlazadas - Invertir una lista enlazada

Problema: Dado el nodo inicial de una lista enlazada simple, invierte la lista y devuelve la lista invertida.

Solución: Podemos resolver este problema invirtiendo iterativamente los punteros de la lista enlazada.

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def reverseList(head):
    prev = None
    curr = head
    while curr:
        next_temp = curr.next
        curr.next = prev
        prev = curr
        curr = next_temp
    return prev

Problema 3: Pilas - Paréntesis válidos

Problema: Dada una cadena s que contiene solo los caracteres '(', ')', '{', '}', '[' y ']', determina si la cadena de entrada es válida. Una cadena de entrada es válida si: Los corchetes abiertos deben cerrarse con el mismo tipo de corchetes, y los corchetes abiertos deben cerrarse en el orden correcto.

Solución: Este problema se puede resolver utilizando una pila.

def isValid(s):
    stack = []
    mapping = {")": "(", "}": "{", "]": "["}
    for char in s:
        if char in mapping:
            top_element = stack.pop() if stack else '#'
            if mapping[char] != top_element:
                return False
        else:
            stack.append(char)
    return not stack

print(isValid("()[]{}"))  # output: True

Problema 4: Árboles - Profundidad máxima de un árbol binario

Problema: Dado el nodo raíz de un árbol binario, devuelve su profundidad máxima. La profundidad máxima de un árbol binario es el número de nodos a lo largo del camino más largo desde el nodo raíz hasta el nodo hoja más lejano.

Solución: Este problema se puede resolver utilizando un algoritmo de búsqueda en profundidad (DFS, por sus siglas en inglés).

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def maxDepth(root):
    if root is None:
        return 0
    else:
        left_height = maxDepth(root.left)
        right_height = maxDepth(root.right)
        return max(left_height, right_height) + 1

Recuerda tomarte un tiempo para entender estos problemas y sus soluciones. La práctica es la clave para dominar el uso de estas estructuras de datos. ¡Feliz codificación!

8.5 Problemas de práctica

Problema 1: Arrays - Suma máxima de subarreglo

Problema: Dado un array de enteros nums, encuentra el subarreglo contiguo (que contenga al menos un número) que tenga la suma más grande y devuelve su suma.

Solución: Podemos resolver este problema utilizando el algoritmo de Kadane. Aquí tienes un código en Python para este problema.

def max_subarray(nums):
    if not nums:
        return 0

    curr_sum = max_sum = nums[0]

    for num in nums[1:]:
        curr_sum = max(num, curr_sum + num)
        max_sum = max(max_sum, curr_sum)

    return max_sum

print(max_subarray([-2,1,-3,4,-1,2,1,-5,4]))  # output: 6

Problema 2: Listas enlazadas - Invertir una lista enlazada

Problema: Dado el nodo inicial de una lista enlazada simple, invierte la lista y devuelve la lista invertida.

Solución: Podemos resolver este problema invirtiendo iterativamente los punteros de la lista enlazada.

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def reverseList(head):
    prev = None
    curr = head
    while curr:
        next_temp = curr.next
        curr.next = prev
        prev = curr
        curr = next_temp
    return prev

Problema 3: Pilas - Paréntesis válidos

Problema: Dada una cadena s que contiene solo los caracteres '(', ')', '{', '}', '[' y ']', determina si la cadena de entrada es válida. Una cadena de entrada es válida si: Los corchetes abiertos deben cerrarse con el mismo tipo de corchetes, y los corchetes abiertos deben cerrarse en el orden correcto.

Solución: Este problema se puede resolver utilizando una pila.

def isValid(s):
    stack = []
    mapping = {")": "(", "}": "{", "]": "["}
    for char in s:
        if char in mapping:
            top_element = stack.pop() if stack else '#'
            if mapping[char] != top_element:
                return False
        else:
            stack.append(char)
    return not stack

print(isValid("()[]{}"))  # output: True

Problema 4: Árboles - Profundidad máxima de un árbol binario

Problema: Dado el nodo raíz de un árbol binario, devuelve su profundidad máxima. La profundidad máxima de un árbol binario es el número de nodos a lo largo del camino más largo desde el nodo raíz hasta el nodo hoja más lejano.

Solución: Este problema se puede resolver utilizando un algoritmo de búsqueda en profundidad (DFS, por sus siglas en inglés).

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def maxDepth(root):
    if root is None:
        return 0
    else:
        left_height = maxDepth(root.left)
        right_height = maxDepth(root.right)
        return max(left_height, right_height) + 1

Recuerda tomarte un tiempo para entender estos problemas y sus soluciones. La práctica es la clave para dominar el uso de estas estructuras de datos. ¡Feliz codificación!

8.5 Problemas de práctica

Problema 1: Arrays - Suma máxima de subarreglo

Problema: Dado un array de enteros nums, encuentra el subarreglo contiguo (que contenga al menos un número) que tenga la suma más grande y devuelve su suma.

Solución: Podemos resolver este problema utilizando el algoritmo de Kadane. Aquí tienes un código en Python para este problema.

def max_subarray(nums):
    if not nums:
        return 0

    curr_sum = max_sum = nums[0]

    for num in nums[1:]:
        curr_sum = max(num, curr_sum + num)
        max_sum = max(max_sum, curr_sum)

    return max_sum

print(max_subarray([-2,1,-3,4,-1,2,1,-5,4]))  # output: 6

Problema 2: Listas enlazadas - Invertir una lista enlazada

Problema: Dado el nodo inicial de una lista enlazada simple, invierte la lista y devuelve la lista invertida.

Solución: Podemos resolver este problema invirtiendo iterativamente los punteros de la lista enlazada.

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def reverseList(head):
    prev = None
    curr = head
    while curr:
        next_temp = curr.next
        curr.next = prev
        prev = curr
        curr = next_temp
    return prev

Problema 3: Pilas - Paréntesis válidos

Problema: Dada una cadena s que contiene solo los caracteres '(', ')', '{', '}', '[' y ']', determina si la cadena de entrada es válida. Una cadena de entrada es válida si: Los corchetes abiertos deben cerrarse con el mismo tipo de corchetes, y los corchetes abiertos deben cerrarse en el orden correcto.

Solución: Este problema se puede resolver utilizando una pila.

def isValid(s):
    stack = []
    mapping = {")": "(", "}": "{", "]": "["}
    for char in s:
        if char in mapping:
            top_element = stack.pop() if stack else '#'
            if mapping[char] != top_element:
                return False
        else:
            stack.append(char)
    return not stack

print(isValid("()[]{}"))  # output: True

Problema 4: Árboles - Profundidad máxima de un árbol binario

Problema: Dado el nodo raíz de un árbol binario, devuelve su profundidad máxima. La profundidad máxima de un árbol binario es el número de nodos a lo largo del camino más largo desde el nodo raíz hasta el nodo hoja más lejano.

Solución: Este problema se puede resolver utilizando un algoritmo de búsqueda en profundidad (DFS, por sus siglas en inglés).

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def maxDepth(root):
    if root is None:
        return 0
    else:
        left_height = maxDepth(root.left)
        right_height = maxDepth(root.right)
        return max(left_height, right_height) + 1

Recuerda tomarte un tiempo para entender estos problemas y sus soluciones. La práctica es la clave para dominar el uso de estas estructuras de datos. ¡Feliz codificación!

8.5 Problemas de práctica

Problema 1: Arrays - Suma máxima de subarreglo

Problema: Dado un array de enteros nums, encuentra el subarreglo contiguo (que contenga al menos un número) que tenga la suma más grande y devuelve su suma.

Solución: Podemos resolver este problema utilizando el algoritmo de Kadane. Aquí tienes un código en Python para este problema.

def max_subarray(nums):
    if not nums:
        return 0

    curr_sum = max_sum = nums[0]

    for num in nums[1:]:
        curr_sum = max(num, curr_sum + num)
        max_sum = max(max_sum, curr_sum)

    return max_sum

print(max_subarray([-2,1,-3,4,-1,2,1,-5,4]))  # output: 6

Problema 2: Listas enlazadas - Invertir una lista enlazada

Problema: Dado el nodo inicial de una lista enlazada simple, invierte la lista y devuelve la lista invertida.

Solución: Podemos resolver este problema invirtiendo iterativamente los punteros de la lista enlazada.

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def reverseList(head):
    prev = None
    curr = head
    while curr:
        next_temp = curr.next
        curr.next = prev
        prev = curr
        curr = next_temp
    return prev

Problema 3: Pilas - Paréntesis válidos

Problema: Dada una cadena s que contiene solo los caracteres '(', ')', '{', '}', '[' y ']', determina si la cadena de entrada es válida. Una cadena de entrada es válida si: Los corchetes abiertos deben cerrarse con el mismo tipo de corchetes, y los corchetes abiertos deben cerrarse en el orden correcto.

Solución: Este problema se puede resolver utilizando una pila.

def isValid(s):
    stack = []
    mapping = {")": "(", "}": "{", "]": "["}
    for char in s:
        if char in mapping:
            top_element = stack.pop() if stack else '#'
            if mapping[char] != top_element:
                return False
        else:
            stack.append(char)
    return not stack

print(isValid("()[]{}"))  # output: True

Problema 4: Árboles - Profundidad máxima de un árbol binario

Problema: Dado el nodo raíz de un árbol binario, devuelve su profundidad máxima. La profundidad máxima de un árbol binario es el número de nodos a lo largo del camino más largo desde el nodo raíz hasta el nodo hoja más lejano.

Solución: Este problema se puede resolver utilizando un algoritmo de búsqueda en profundidad (DFS, por sus siglas en inglés).

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def maxDepth(root):
    if root is None:
        return 0
    else:
        left_height = maxDepth(root.left)
        right_height = maxDepth(root.right)
        return max(left_height, right_height) + 1

Recuerda tomarte un tiempo para entender estos problemas y sus soluciones. La práctica es la clave para dominar el uso de estas estructuras de datos. ¡Feliz codificación!