

使用 贪心算法 来解决这个问题,思路如下:
- 遍历 flowerbed 数组,找到值为
0的地块。 - 检查该地块的前后是否为空 (即
flowerbed[i-1]和flowerbed[i+1]是否都为0或者i在边界)。 - 如果可以种花,就将
flowerbed[i]设为1并减少n的数量。 - 如果
n变成0,提前返回True,表示可以种下所有的花。 - 遍历结束后,如果仍然
n > 0,返回False。
代码实现如下:
python
from typing import List
def canPlaceFlowers(flowerbed: List[int], n: int) -> bool:
length = len(flowerbed)
for i in range(length):
if flowerbed[i] == 0:
prev_empty = (i == 0 or flowerbed[i - 1] == 0) # 边界或前一个为空
next_empty = (i == length - 1 or flowerbed[i + 1] == 0) # 边界或后一个为空
if prev_empty and next_empty: # 满足种植条件
flowerbed[i] = 1
n -= 1
if n == 0:
return True # 直接返回
return n <= 0 # 如果 n 还大于 0,说明不能全部种下
# 测试
print(canPlaceFlowers([1, 0, 0, 0, 1], 1)) # True
print(canPlaceFlowers([1, 0, 0, 0, 1], 2)) # False
print(canPlaceFlowers([0, 0, 1, 0, 0], 1)) # True
复杂度分析:
- 时间复杂度:O(n),只需要遍历一遍数组。
- 空间复杂度:O(1),仅使用了常数额外空间。
这样可以高效判断能否种入 n 朵花,且尽可能早返回结果。