解題說明
Can Place Flowers
題目描述:給定花壇陣列 flowerbed(0 表示空、1 表示已種花),相鄰格不能都種花。問能否再種入 n 朵花。
解題思路:貪心法:從左到右掃描,當 flowerbed[i] == 0 且左右相鄰(或邊界)均為 0 時,立即在此處種花(設為 1)並跳過下一格(i+=2)。貪心地盡早種花是最優策略,因為靠左種不會妨礙更多的空位。計數能種的朵數,最後比較是否 >= n。
C++ 解法
複雜度分析
時間複雜度:O(m) — m 為花壇長度,線性掃描一次。
空間複雜度:O(1) — 原地修改 flowerbed,只用常數額外空間。
虛擬碼
1. count = 0, size = len(flowerbed)
2. For i from 0 to size-1:
a. If flowerbed[i] == 0:
- leftEmpty = (i==0 or flowerbed[i-1]==0)
- rightEmpty = (i==size-1 or flowerbed[i+1]==0)
- If leftEmpty and rightEmpty:
flowerbed[i] = 1, count++, i++ (skip next)
3. Return count >= n其他解法
計算最大可種數後比較:用數學方式計算每段連續 0 的區間最多能種幾朵(長度為 L 的全 0 段,靠近邊界時可種 (L+1)//2,否則 (L-1)//2),加總後與 n 比較。不修改原陣列,適合需要保留原始資料的場景。
二分搜索:若只需判斷「能否種 n 朵」,可二分答案,但本題直接貪心更簡單。
延伸思考
- 若花壇是環形(首尾相鄰),最多能種幾朵花?
- 若每朵花需要間隔至少 k 個空格(而非 1 個),貪心條件如何修改?
- 若不允許修改
flowerbed陣列,純計算最大可種數的方法是什麼?