

使用 贪心算法 来解决这个问题,思路如下:
- 遍历 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
朵花,且尽可能早返回结果。