天天看點

Leetcode 135題記錄

Leetcode 135題 記錄

題目:

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

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

1.每個孩子至少配置設定到 1 個糖果。

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

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

示例:

輸入:[1,2,2]

輸出:4

解釋:你可以分别給這三個孩子分發 1、2、1 顆糖果。第三個孩子隻得到 1 顆糖果,這已滿足上述兩個條件。

思路:

要求1可以通過先給每個孩子配置設定1顆糖來滿足;

要求2可以分為兩個部分:①若右邊孩子比左邊評分高,則右邊孩子有比左邊孩子多的糖果②若左邊孩子比右邊評分高,則左邊孩子有比右邊孩子多的糖果。利用貪心算法,先滿足①再滿足②。是以經過兩次周遊完成解題。

class Solution {
public:
    int sum = 0;
public:
    int candy(vector<int>& ratings) {
        if(ratings.size() == 1) return 1;
        else {
            vector<int> candy = vector<int> (ratings.size(),1);
            sum = ratings.size();
            for(int i = 0; i < ratings.size() - 1; i++){
                if(ratings[i]<ratings[i+1]){
                    sum += candy[i]+1-candy[i+1];
                    candy[i+1] = candy[i]+1;
                }
            }
            for(int i = ratings.size()-1; i >= 1; i--){
                if(ratings[i]<ratings[i-1]&&candy[i]>=candy[i-1]){
                    sum += candy[i]+1-candy[i-1];
                    candy[i-1] = candy[i]+1;
                }
            }
            return sum;
        }
    }
};
           

反思:

貪心算法的思路是把問題拆解成子問題。在每個子問題中尋求最優解,由局部最優解合成整體的最優解。在455題分餅幹問題中,子問題指的是找到目前最小的餅幹滿足所能喂飽的胃口值最小的孩子。每一塊餅幹都尋得最優配置設定,最終就會得到最優解。在此問題中,子問題是分别滿足兩個要求。當兩個要求都剛好滿足時,得到最少糖果數量。