LeetCode 135. 分發糖果【貪心】

題目描述

一羣孩子站成一排,每一個孩子有自己的評分。現在需要給這些孩子發糖果,規則是如果一 個孩子的評分比自己身旁的一個孩子要高,那麼這個孩子就必須得到比身旁孩子更多的糖果;所有孩子至少要有一個糖果。求解最少需要多少個糖果。

解題思路

  • 把所有孩子的糖果數初始化爲 1; 先從左往右遍歷一遍,如果右邊孩子的評分比左邊的高,則右邊孩子的糖果數更新爲左邊孩子的 糖果數加1;

  • 再從右往左遍歷一遍,如果左邊孩子的評分比右邊的高,且左邊孩子當前的糖果數 不大於右邊孩子的糖果數,則左邊孩子的糖果數更新爲右邊孩子的糖果數加1。

  • 通過這兩次遍歷, 分配的糖果就可以滿足題目要求了。這裏的貪心策略即爲,在每次遍歷中,只考慮並更新相鄰一 側的大小關係。

AC

class Solution {
public:
    int candy(vector<int>& ratings) {
        int size = ratings.size();
        if(size<2) return size;
        vector<int> v(size,1);
        //先從左到右遍歷
        for(int i=0;i<size-1;i++){
            if(ratings[i+1]>ratings[i])
                v[i+1]=v[i]+1;
        }
        //再從右到左遍歷
        for(int i=size-1;i>=1;i--){
            if(ratings[i-1]>ratings[i])
                v[i-1]=max(v[i-1],v[i]+1);
        }
        return accumulate(v.begin(),v.end(),0);
    }
};
學如逆水行舟,不進則退
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章