Colocar Flores - LeetCode 605


Descripción

Se tiene una serie de macetas en la que algunas tienen flores y otras no. Queremos saber si podemos colocar más flores con la restricción de que no se pueden plantar en macetas que adyacentas.

Se da un array llamado flowerbed que contiene 0s y 1s, donde 0 significa que la maceta está vacía y 1 significa que tiene una flor, también se da un entero n que indica el número de flores por plantar.

Completa la función canPlaceFlower para devolver True si se pueden plantar n nuevas flores en la serie de macetas sin romper la regla de no tener flores adyacentes. Si la regla se rompe, devuelve False.

Ejemplo 1

Entrada: flowerbed = [1,0,0,0,1], n = 1
Salida: True

Ejemplo 2:

Entrada: flowerbed = [1,0,0,0,1], n = 2
Salida: False

Restricciones:

  • 1 <= flowerbed.length <= 2 * 104
  • flowerbed[i] es 0 o 1.
  • No debe haber flores adyacentes en las macetas.
  • 0 <= n <= flowerbed.length

Solución

Mostrar solución
class Solution:
    def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
        # Recorrer array flowerbed
        for i in range(len(flowerbed)):
            # Buscar un lugar para colocar la flor, cumpliendo regla de no ser adyacente

            # Terminar el ciclo si no hay más flores por colocar
            if n == 0:
                break

            # Si la maceta está ocupada, ir a la siguiente posición
            if flowerbed[i] == 0:
                # Valores para indicar si los lados de la posición están libres
                left_ok = True
                right_ok = True

                # Si la posición de la izquierda es válida
                if (i - 1) >= 0:
                    # Revisamos la posición
                    if flowerbed[i - 1] == 1:
                        # Si esta ocupada, la marcamos como ocupada / no libre
                        left_ok = False

                # Si la posición de la derecha es válida
                if (i + 1) < len(flowerbed):
                    # Revisamos la posición
                    if flowerbed[i + 1] == 1:
                        # Si esta ocupada, la marcamos como ocupada / no libre
                        right_ok = False

                # Si ambas posiciones están libres
                if left_ok and right_ok:
                    # Colocar flor
                    flowerbed[i] = 1
                    
                    # Testar la flor colcada
                    n -= 1

                # Si no podemos colocar la flor, probar siguiente posición
        # Terminamos de recorrer flowerbed

        # Devolver True solo si no quedan flores que colocar
        return n == 0

Solución en Google Colab Probar Solución

-

Live Resolviendo el Ejercicio

Fuente del ejercicio: https://leetcode.com/problems/can-place-flowers/