Leetcode Leetcode605。開花の問題

非常に長い花壇があり、区画の一部に花が植えられているが、他の部分には花が植えられていないとします。しかし、隣接する区画に花を植えることはできず、水を奪い合い、両方とも死んでしまいます。

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

実行結果:

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_50791900/article/details/112127004