C 刷題 leetcode貪心系列 一

2021-10-22 03:38:51 字數 1361 閱讀 3359

1.老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。

2.你需要按照以下要求,幫助老師給這些孩子分發糖果:

每個孩子至少分配到 1 個糖果。

3.評分更高的孩子必須比他兩側的鄰位孩子獲得更多的糖果。

4.那麼這樣下來,老師至少需要準備多少顆糖果呢?

示例 1

輸入:[1,0,2]

輸出:5

解釋:你可以分別給這三個孩子分發 2、1、2 顆糖果。

示例 2

輸入:[1,2,2]

輸出:4

解釋:你可以分別給這三個孩子分發 1、2、1 顆糖果。

第三個孩子只得到 1 顆糖果,這已滿足上述兩個條件。

這是一道貪心策略的題,我們只需要簡單的進行兩次遍歷即可,把所有孩子的糖果數初始化為1,先從左到右遍歷一遍,如果右邊的孩子分數比左邊的孩子高,那麼我們就將右邊糖果數更新為左邊糖果數加1,緊接著再從右邊到左邊遍歷一遍,同理,如果左邊的孩子分數比右邊孩子的高且不大於右邊孩子的糖果數,那麼我們就將左邊的糖果數更新為右邊糖果數加1,通過這兩次遍歷,就滿足題目要求了,這裡採用的貪心策略是分配的時候只考慮並關心一側的大小關係。

class

solution

} #從右向左遍歷

for(int i=size-

1;i>

0;i--)}

#求和int num =

accumulate

(candy_num.

begin()

,candy_num.

end(),

0);return num;}}

;

踩坑
剛開始的想法是從左到右和從右到左依次進行判斷,但是這樣是不行的,因為進行從左到右和從右到左的時候依次判斷前面的分數比後面的大或者後面的分數比前面的大,這樣會造成出現有的孩子評分大於旁邊的孩子,但是糖果數確相同的情況

舉例:因為順序比較,會出現如果分數相同的時候,我們是對前面的大小進行比較,這樣就容易出現漏洞,沒有做到全面的比較,導致結果不可信

評分:【1,2,87,87,87,2,1】 -> 【1,2,2,1,2,2,1】

不符合題意

C 刷題 leetcode貪心系列 二

給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。注意 可以認為區間的終點總是大於它的起點。區間 1,2 和 2,3 的邊界相互 接觸 但沒有相互重疊。示例 1 輸入 1,2 2,3 3,4 1,3 輸出 1 解釋 移除 1,3 後,剩下的區間沒有重疊。示例 2 輸入 1,2 1,...

C 刷題 leetcode貪心系列 四

字串 s 由小寫字母組成。我們要把這個字串劃分為盡可能多的片段,同一字母最多出現在乙個片段中。返回乙個表示每個字串片段的長度的列表。示例 輸入 s ababcbacadefegdehijhklij 輸出 9,7,8 解釋 劃分結果為 ababcbaca defegde hijhklij 每個字母最多...

Leetcode刷題系列(六)貪心演算法

在某乙個標準下,優先考慮最滿足標準的樣本,最後考慮最不滿足標準的樣本,最終得到乙個答案的演算法,叫作貪心演算法。也就是說,不從整體最優上加以考慮,所做出的是在某種意義上的區域性最優解。如何從區域性最優達到全域性最優解?舉反例和對數器來進行證明。對於給定的糖果和孩子胃口,看能最多滿足多少孩子。解題思路...