先生はお菓子を子供たちに配りたいと思っています。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