2(過)
3老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。
你需要按照以下要求,幫助老師給這些孩子分發糖果:
那麼這樣下來,老師至少需要準備多少顆糖果呢?每個孩子至少分配到 1 個糖果。
相鄰的孩子中,評分高的孩子必須獲得更多的糖果。
示例 1:
輸入: [1,0,2]
輸出: 5
解釋: 你可以分別給這三個孩子分發 2、1、2 顆糖果。
示例 2:
輸入: [1,2,2]
輸出: 4
解釋: 你可以分別給這三個孩子分發 1、2、1 顆糖果。
第三個孩子只得到 1 顆糖果,這已滿足上述兩個條件。
這道題我一開始想的就是上公升流下降流,結果就是搞不了上公升下降怎麼轉換判斷,本來我想的是比如123432這樣的變成乙個陣列,[4,2],就是上公升4個,下降2個這樣的,如果這樣其實也就不用記錄在陣列裡了,只和上乙個流有關,但是我就是不會轉換,上公升下降的轉換.就看答案去了(/(ㄒoㄒ)/~~)
首先給所有的元素賦值1.
對於每乙個元素向左向右判斷是否ratings大,但是給的糖果少,如果少就給自己變成+1
如 ratings[i]>ratings[i-1] &&candy[i]<=candy[i-1]
->candy[i]=candy[i-1]+1;
ratings[i]>ratings[i+1]&&candy[i]<=candy[i+1]
->candy[i]=candy[i+1]+1;
注意在遍歷到i的時候,處理要以i元素為中心,因為是從1開始的,所以遇到ratings打的元素是小的元素+1,而不是大的元素-1;
每次處理完成後,看此次處理是否沒有影響candy陣列,沒有影響就說明調整的正好了,直接退出計算糖果數就可以了.
這個方法的複雜度是o(n2)以上的,具體不會算.但是超時了.
這個思路是計算每個位置最小是多少.然後填寫,每個位置的最小是多少由左右比他小的連續的序列的長度決定,比如4123,3左邊的最小的是123這個序列,所以left[3]=3,由於右邊沒有元素,所以right[3]=1,在求這個元素多少糖的時候,就是max(left[i],right[i]),因為要滿足兩邊的條件.這樣其實也是我一開始思路計算連續長度的一種轉化,轉化成左右兩個方向.//44/48
class
solution
for(
int i=
1;i1;i++)if
(ratings[i]
>ratings[i-1]
&&dd[i]
<=dd[i-1]
)}if(ratings[sz-1]
>ratings[sz-2]
&&dd[sz-1]
<=dd[sz-2]
)}int ans=0;
for(
int i=
0;i)return ans;}}
;
ps:這種解法讓我想起我在演算法筆記裡的一道題.其實可以只用乙個陣列,是在計算完left[sz]陣列後,從右向左遍歷,一邊計算右邊的長度,直接進行這個位置的數字的計算.省了一遍的o(n)遍歷具體如下:class
solution
tmp=1;
for(
int i=sz-
2;i>=
0;i--
)for
(int i=
0;i)return ans;}}
;
**(改了一點的)
**官方題解://假的吧,這個比上面的還慢!
class
solution
tmp=1;
ans+
=max
(left[sz-1]
,1);
for(
int i=sz-
2;i>=
0;i--
)return ans;}}
;
這個思路和我一開始的不謀而合,就是看流,然後計算每乙個流,不過這個思路是好想,但是實現比較難(至少對我來說).
對於區域性的分配,都是乙個上公升或者下降的趨勢,如1234321,有兩個趨勢1234,4321.每個趨勢都是可以通過n*(n+1)/2來計算所有趨勢裡的糖果數的.
有兩個處理難點,乙個是峰谷或者谷底的歸屬,還有上下的轉換.
如1234531,5歸屬12345,31自己不受約束計算就是長度2->2*(2+1)/2=3個糖.
谷底就是1,兩邊都算32134,1兩邊的長度都要算.
計算按照上公升-下降這樣的趨勢來計算,在一次的上公升下降趨勢後,來看峰頂歸上公升流還是下降流
對於乙個相等的處理就是當成兩端,只不過有一段只有下降/上公升
class
solution
intcandy
(vector<
int>
& ratings)
if(now>
0) up++;if
(now<
0) down++;if
(now==
0) ans++
; last=now;
} ans+
=cal
(up)
+cal
(down)
+max
(up,down)+1
;return ans;}}
;
LeetCode 135 分發糖果
老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?示例 1 輸入 1,0,2 輸出 ...
leetcode135 分發糖果
一道很有意思的題目,難度級別為 困難。題目是這樣的的 老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需...
leetcode135 分發糖果
老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?示例 1 輸入 1,0,2 輸出 ...