題目:
老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果:
每個孩子至少分配到 1 個糖果。
評分更高的孩子必須比他兩側的鄰位孩子獲得更多的糖果。
那麼這樣下來,老師至少需要準備多少顆糖果呢?
思路:
將每個數當看作乙個波浪線中的峰值,從左向右掃瞄一次,再從右向左掃瞄一次,掃瞄到當前數即停止,取兩者中較大的值。具體過程如下:
掃瞄兩次:
第一次,從左向右掃瞄,將第乙個人擁有的糖果數設定為1,即left[0]=1。掃瞄時,若當前值大於前乙個值,則將當前值在前乙個值的基礎上加1,否則令當前值為1。
第二次,從右向左掃瞄,邊掃瞄邊判斷,並對最終結果進行累加。將第乙個人擁有的糖果數設定為1,即right[n-1]=0。掃瞄時,若當前值大於前乙個值,則將當前值在前乙個值的基礎上加1,否則令當前值為1。取left[i]和right[i]中較大的數,對最終結果進行累加。
解答:
class
solution
:def
candy
(self, ratings: list[
int])-
>
int:
n =len(ratings)
left =[0
]* n
for i in
range
(n):
if i >
0and ratings[i]
> ratings[i -1]
: left[i]
= left[i -1]
+1else
: left[i]=1
right = ret =
0for i in
range
(n -1,
-1,-
1):if i < n -
1and ratings[i]
> ratings[i +1]
: right +=
1else
: right =
1 ret +=
max(left[i]
, right)
return ret
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...
LeetCode每日一題(題139)
題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...