1. 題目
?
有一個花壇,其中0
?表示該位置是空的,可以種花。1
?表示該位置已經有花,不能種花。
規則:新種的花不能種在相鄰的位置(即如果某個位置已經種了花,它的左右兩個相鄰位置不能再種花)。給定 花壇flowerbed
?數組和需要新種的花的數量 n
,判斷是否可以成功種下 n
朵新花。
2. 示例
輸入:
flowerbed = [1,0,0,0,1], n = 1
輸出:True
解釋:可以在中間位置種 1 朵花而不違反規則。
3. 解題思路
核心思想: 貪心算法(嘗試在可以種花的位置立即種花,以盡早滿足 n 的要求)。
- 遍歷數組:檢查每一個位置是否可以種花。
- 判斷條件:
- 當前位置是?
0
(空)。 - 當前位置的左邊是?
0
(或者是邊界,即左邊沒有花)。 - 當前位置的右邊是?
0
(或者是邊界,即右邊沒有花)。
- 當前位置是?
- 如果可以種花:
- 把該位置設為?
1
(標記為已種)。 - 計數器?
count += 1
(記錄已種的花數)。
- 把該位置設為?
- 終止條件:
- 當?
count >= n
?時,可以直接返回?True
(表示已經可以種?n
?朵花了)。 - 遍歷結束后如果?
count >= n
,返回?True
,否則返回?False
。
- 當?
4. 完整代碼
def canPlaceFlowers(flowerbed, n):count = 0 # 記錄可以種的花的數量length = len(flowerbed)for i in range(length):if flowerbed[i] == 0: # 當前位置是空的# 檢查左邊(如果是第一個位置則左邊視為空)left_empty = (i == 0) or (flowerbed[i-1] == 0)# 檢查右邊(如果是最后一個位置則右邊視為空)right_empty = (i == length - 1) or (flowerbed[i+1] == 0)if left_empty and right_empty:flowerbed[i] = 1 # 種花count += 1if count >= n: # 提前終止return Truereturn count >= n
print(canPlaceFlowers([1,0,0,0,1], 1))
?
?