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]
is 0
or 1
.- 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)$.
1
2
3
4
5
6
7
8
| 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
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| 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;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| 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;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| 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
}
|
1
2
3
4
5
6
7
8
9
10
11
12
| 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;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| 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
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| 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;
}
}
|