leetcode 135 分發糖果

2021-10-22 15:26:42 字數 1343 閱讀 3514

方法一: 貪心演算法+兩次遍歷

解題思路:

* 規則定義: 設學生 a 和學生 b 左右相鄰,a 在 bb左邊;

* 左規則: 當 ratings_b>ratingsa時,b 的糖比 a 的糖數量多

* 右規則: 當 ratings_a>ratingsb時,aa的糖比 b 的糖數量多。

步驟:先給所有的學生一顆糖

從左往右遍歷陣列,如果右邊比左邊評分高,則左邊糖果=右邊糖果數+1

從右往左遍歷,如果左邊比相鄰右邊評分高,並且右邊的糖果數多餘左邊的 糖果數,則左邊的糖果數=右邊糖果數+1,並對其糖果數累加

返回結果值

int

candy

(vector<

int>

& ratings)

for(

int i=ratings.

size()

-2;i>=

0;i--

) result+

=res[0]

;return result;

}優化:

intcandy

(vector<

int>

& ratings)

else

}int right =

0, ret =0;

//定義乙個變數,用於記錄從右往左變化時 糖果數量的變化

for(

int i = n -

1; i >=

0; i--

)else

ret +

=max

(left[i]

, right);}

return ret;

}

方法二:常數空間遍歷

思路:從左往後開始列舉每個同學,記前乙個同學分得的糖果數量為pre

如果當前同學比上乙個同學評分高,說明我們就在最近的遞增序列中,直接分配給該同學 \textit + 1pre+1

個糖果即可

否則我們就在乙個遞減序列中,我們直接分配給當前同學乙個糖果,並把該同學所在的遞減序列中所有的同學都再多分配乙個糖果,以保證糖果數量還是滿足條件。

我們只要記錄當前遞減序列的長度 dec,最近的遞增序列的長度 inc 和前乙個同學分得的糖果數量pre 即可

注意:一定要考慮相同的數連續出現的情況

int

candy

(vector<

int>

& ratings)

else

}return result;

}

LeetCode 135 分發糖果

老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?示例 1 輸入 1,0,2 輸出 ...

leetcode135 分發糖果

一道很有意思的題目,難度級別為 困難。題目是這樣的的 老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需...

leetcode135 分發糖果

老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?示例 1 輸入 1,0,2 輸出 ...