Можно ли посадить цветы?

Легкая

Описание задачи #

Вам дан целочисленный массив flowerbed и число n.

Массив описывает цветочную клумбу, каждый элемент массива может принимать значение 1 (на этом месте посажен цветок) и 0 (пустое место). Существует ограничение - цветы не могут быть посажены на соседних местах.

Необходимо написать функцию, которая определит, можем ли мы посадить в нашу клумбу n новых цветов.


Ограничения #


Примеры #

  • Входные данные: flowerbed = [1,0,0,0,1], n = 1

    Ответ: true

    Нам необходимо посадить один цветок. Не нарушая требований, мы можем поместить на место с индексом 2 ([1,0,0,0,1]).

  • Входные данные: [1,0,0,0,1], n = 2

    Ответ: false

    Не нарушая требований, мы не можем посадить на клумбу 2 цветка.


Решение #

Задача достаточно тривиальна и может быть решена в один проход по исходному массиву:

Не забываем также отдельно обработать корнер кейсы (например, если размер клумбы равен 1 элементу).

  • package main
    
    func canPlaceFlowers(flowerbed []int, n int) bool {
    	if n == 0 {
    		return true
    	}
    
    	if len(flowerbed) == 0 {
    		return false
    	}
    
    	if len(flowerbed) == 1 {
    		if n > 1 {
    			return false
    		}
    
    		return flowerbed[0] == 0
    	}
    
    	for i := 0; i < len(flowerbed); i++ {
    		if flowerbed[i] == 1 {
    			i++
    			continue
    		}
    
    		if canBePlaced(flowerbed, i) {
    			flowerbed[i] = 1
    			n--
    			i++
    		}
    
    		if n == 0 {
    			return true
    		}
    	}
    
    	return n == 0
    }
    
    func canBePlaced(flowerbed []int, i int) bool {
    	if i == 0 {
    		return flowerbed[i+1] == 0
    	}
    
    	if i == len(flowerbed)-1 {
    		return flowerbed[i-1] == 0
    	}
    
    	return flowerbed[i-1] == 0 && flowerbed[i+1] == 0
    }

  • const canBePlaced = (flowerbed: number[], i: number): boolean => {
        if (i == 0) {
            return flowerbed[i + 1] == 0
        }
    
        if (i == flowerbed.length - 1) {
            return flowerbed[i - 1] == 0
        }
    
        return flowerbed[i - 1] == 0 && flowerbed[i + 1] == 0
    }
    
    export const canPlaceFlowers = (flowerbed: number[], n: number): boolean => {
        if (n == 0) {
            return true
        }
    
        if (flowerbed.length == 0) {
            return false
        }
    
        if (flowerbed.length == 1) {
            if (n > 1) {
                return false
            }
    
            return flowerbed[0] == 0
        }
    
        for (let i = 0; i < flowerbed.length; i++) {
            if (flowerbed[i] == 1) {
                i++
                continue
            }
    
            if (canBePlaced(flowerbed, i)) {
                flowerbed[i] = 1
                n--
                i++
            }
    
            if (n == 0) {
                return true
            }
        }
    
        return n == 0
    }

Оценка сложности #

По времени

Для того чтобы найти ответ, нам достаточно один раз пройтись по исходному массиву. То есть, сложность алгоритма равна O(n).

По памяти

Так как нам не понадобились дополнительные структуры данных, которые зависели бы от размера входного массива, сложность по памяти константная — O(1).

Оригинал задачи на Leetcode
< Предыдущая задача
Следующая задача >