Leetcode135。キャンディ欲張りアルゴリズムを配布する

先生はお菓子を子供たちに配りたいと思っています。N人の子供たちが一直線に並んでいて、先生はそれぞれの子供たちのパフォーマンスに基づいて事前に評価します。

次の要件に従って、教師がこれらの子供たちにキャンディーを配布するのを手伝う必要があります。

各子供には少なくとも1つのキャンディーが割り当てられます。
隣接する子供たちの中で、スコアが高い子供はより多くのキャンディーを手に入れる必要があります。
では、先生はいくつのキャンディーを用意する必要がありますか?

例1:

入力:[1,0,2]
出力:5
説明:2、1 、および2つのキャンディーを3人の子供に配布できます。

example2:
入力:[1,2,2]
出力:4
説明:1、2、および1つのキャンディーを3人の子供に配布できます。
3番目の子供はキャンディーを1つだけ受け取ります。これは、すでに上記の2つの条件を満たしています。

この問題は欲張りアルゴリズムで解決できます
(この問題を解決するために辞書を使用したいのですが、辞書にインデックスがないようです)。
最初に評価の長さのシーケンスを作成し、各子に1つのキャンディーがあることを確認します。
トラバース左から右にフィルタリングします。左側よりも右側の
スコアが高い子
選択した後、スコアが低い子よりもスコアが高い子数に1加算します。次に、右から左にトラバースして
左側のスコアが高い子供は、スコアが低い子供よりもスコアが高い子供を許可します。キャンディーの数は1つ増え
ます。2回のトラバースの後
、隣の子供よりもスコアが高いすべての子供が2番目に多くなります。周りのスコアが低い子供よりもキャンディー
最後に、ansの値がトラバースされ、resに追加されてansが
出力さます。

リサイクル量が多く、運転効率は特に理想的ではありません

class Solution:
    def candy(self, ratings: List[int]) -> int:
        res = 0
        ans = [1] * len(ratings)
        
        for i in range(1, len(ratings)):
            if ratings[i] > ratings[i - 1] and ans[i] <= ans[i - 1]:
                ans[i] = ans[i - 1] + 1
        
        for j in range (len(ratings) -2, -1 , -1):
            if ratings[j] > ratings[j + 1] and ans[j] <= ans[j + 1]:
                ans[j] = ans[j + 1] + 1
        
        for z in ans:
            res += z
        
        return res

おすすめ

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