Welcome to Subscribe On Youtube
605. Can Place Flowers
Description
You have a long flowerbed in which some of the plots are planted, and some are not. However, flowers cannot be planted in adjacent plots.
Given an integer array flowerbed
containing 0
's and 1
's, where 0
means empty and 1
means not empty, and an integer n
, return true
if n
new flowers can be planted in the flowerbed
without violating the no-adjacent-flowers rule and false
otherwise.
Example 1:
Input: flowerbed = [1,0,0,0,1], n = 1 Output: true
Example 2:
Input: flowerbed = [1,0,0,0,1], n = 2 Output: false
Constraints:
1 <= flowerbed.length <= 2 * 104
flowerbed[i]
is0
or1
.- There are no two adjacent flowers in
flowerbed
. 0 <= n <= flowerbed.length
Solutions
Solution 1: Greedy
We directly traverse the array $flowerbed$. For each position $i$, if $flowerbed[i]=0$ and its adjacent positions on the left and right are also $0$, then we can plant a flower at this position. Otherwise, we cannot. Finally, we count the number of flowers that can be planted. If it is not less than $n$, we return $true$, otherwise we return $false$.
The time complexity is $O(n)$, where $n$ is the length of the array $flowerbed$. We only need to traverse the array once. The space complexity is $O(1)$.
-
class Solution { public boolean canPlaceFlowers(int[] flowerbed, int n) { int m = flowerbed.length; for (int i = 0; i < m; ++i) { int l = i == 0 ? 0 : flowerbed[i - 1]; int r = i == m - 1 ? 0 : flowerbed[i + 1]; if (l + flowerbed[i] + r == 0) { flowerbed[i] = 1; --n; } } return n <= 0; } }
-
class Solution { public: bool canPlaceFlowers(vector<int>& flowerbed, int n) { int m = flowerbed.size(); for (int i = 0; i < m; ++i) { int l = i == 0 ? 0 : flowerbed[i - 1]; int r = i == m - 1 ? 0 : flowerbed[i + 1]; if (l + flowerbed[i] + r == 0) { flowerbed[i] = 1; --n; } } return n <= 0; } };
-
class Solution: def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool: flowerbed = [0] + flowerbed + [0] for i in range(1, len(flowerbed) - 1): if sum(flowerbed[i - 1 : i + 2]) == 0: flowerbed[i] = 1 n -= 1 return n <= 0
-
func canPlaceFlowers(flowerbed []int, n int) bool { m := len(flowerbed) for i, v := range flowerbed { l, r := 0, 0 if i > 0 { l = flowerbed[i-1] } if i < m-1 { r = flowerbed[i+1] } if l+v+r == 0 { flowerbed[i] = 1 n-- } } return n <= 0 }
-
function canPlaceFlowers(flowerbed: number[], n: number): boolean { const m = flowerbed.length; for (let i = 0; i < m; ++i) { const l = i === 0 ? 0 : flowerbed[i - 1]; const r = i === m - 1 ? 0 : flowerbed[i + 1]; if (l + flowerbed[i] + r === 0) { flowerbed[i] = 1; --n; } } return n <= 0; }
-
class Solution { /** * @param Integer[] $flowerbed * @param Integer $n * @return Boolean */ function canPlaceFlowers($flowerbed, $n) { array_push($flowerbed, 0); array_unshift($flowerbed, 0); for ($i = 1; $i < count($flowerbed) - 1; $i++) { if ($flowerbed[$i] === 0) { if ($flowerbed[$i - 1] === 0 && $flowerbed[$i + 1] === 0) { $flowerbed[$i] = 1; $n--; } } } return $n <= 0; } }
-
impl Solution { pub fn can_place_flowers(flowerbed: Vec<i32>, n: i32) -> bool { let (mut flowers, mut cnt) = (vec![0], 0); flowers.append(&mut flowerbed.clone()); flowers.push(0); for i in 1..flowers.len() - 1 { let (l, r) = (flowers[i - 1], flowers[i + 1]); if l + flowers[i] + r == 0 { flowers[i] = 1; cnt += 1; } } cnt >= n } }