非常に長い花壇があり、区画の一部に花が植えられているが、他の部分には花が植えられていないとします。しかし、隣接する区画に花を植えることはできず、水を奪い合い、両方とも死んでしまいます。
0と1の数で構成される花壇を表す整数配列の花壇を指定します。ここで、0は花が植えられていないことを意味し、1は花が植えられていることを意味します。n個もあります。植え付け規則に違反せずにn個の花を植えることはできますか?可能な場合はtrueを返し、できない場合はfalseを返します。
例1:
入力:花壇= [1,0,0,0,1]、n = 1
出力:true
例2:
入力:花壇= [1,0,0,0,1]、n = 2
出力:false
アイデア:
最初に、全体的なアイデアは、ansとして植えられる
花の最大量を計算し、
植えられる花の量をnと比較することです。ansがn以上の場合、n個の花を植えることができ、Trueを返します。
ansがn未満の場合、n個の花を植えることができず、Falseを返します。
その後のグループディスカッション
1.両側の花壇(インデックス0、-1の花壇)の場合:両側の
花壇の横にある花壇
が0の両側の花壇である限り、花を植えることができます。
2.中央の花壇の場合(インデックスが0、-1、1、-2の花壇を除く):
周囲の2つの花壇が両方とも0の場合にのみ、
中央の花壇は花を植えることができます
(横断した花壇はすでに植えられた、次の花壇花を植えることはできません。次の花壇をスキップしてください)
3.インデックスが1、-2
の2つの花壇で、2つの花壇の周囲が0の場合、両側に花を植えるか、2つの花壇の結果が同じになります。
たとえば、
開始シーケンスが
0、0、0、1の場合、単語はインデックス0に植えられます。または、インデックス1は1つしか植えられません。
コード:
class Solution:
def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
ans = 0
if len(flowerbed) == 1:
if flowerbed[0] == 0 and n <= 1:
return True
elif n == 0:
return True
else:
return False
if flowerbed[0] == 0 and flowerbed[1] == 0:
ans += 1
flowerbed[0] = 1
if flowerbed[-2] == 0 and flowerbed[-1] == 0:
ans += 1
flowerbed[-1] = 1
i = 2
while i < len(flowerbed) - 2:
if flowerbed[i - 1] == 0 and flowerbed[i + 1] == 0 and flowerbed[i] != 1:
flowerbed[i] = 1
ans += 1
i += 1
i += 1
if ans >= n:
return True
else:
return False
実行結果: