leetcode 135 分發糖果

2021-10-09 02:55:01 字數 2780 閱讀 6812

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)以上的,具體不會算.但是超時了.

//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;}}

;

這個思路是計算每個位置最小是多少.然後填寫,每個位置的最小是多少由左右比他小的連續的序列的長度決定,比如4123,3左邊的最小的是123這個序列,所以left[3]=3,由於右邊沒有元素,所以right[3]=1,在求這個元素多少糖的時候,就是max(left[i],right[i]),因為要滿足兩邊的條件.這樣其實也是我一開始思路計算連續長度的一種轉化,轉化成左右兩個方向.

class

solution

tmp=1;

for(

int i=sz-

2;i>=

0;i--

)for

(int i=

0;i)return ans;}}

;

ps:這種解法讓我想起我在演算法筆記裡的一道題.其實可以只用乙個陣列,是在計算完left[sz]陣列後,從右向左遍歷,一邊計算右邊的長度,直接進行這個位置的數字的計算.省了一遍的o(n)遍歷具體如下:

**(改了一點的)

//假的吧,這個比上面的還慢!

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 輸出 ...