135. Candy

題目描述:N個孩子坐在一排,每個孩子分配一個等級值,按如下要求給每個孩子分糖:

  1. 每個孩子至少有一個
  2. 等級高的孩子比其左右孩子多

問最少需要多少糖

分析:一個方向的比較只能滿足一邊的大小要求,兩次遍歷分別從前到后和從后到前,最后加起來。時間復雜度O(n),空間O(n)。

代碼

class Solution {
public:
    int candy(vector<int>& ratings) {
        int n = ratings.size();
        vector<int> v(n);          //記錄第 i 個孩子的最少增加糖的個數
        for (int i = 1, inc = 1; i < n; i ++)       //inc是加給糖的個數,最少當然是多給1個
        {
            if (ratings[i] > ratings[i - 1])
                v[i] = max(inc ++, v[i]);         //等級每增大一個下一個 inc 就要多加一個
            else 
                inc = 1;               //出現下降則重新置1
        }
        for (int i = n - 2, inc = 1; i >= 0; i --)
        {
            if (ratings[i] > ratings[i + 1])
                v[i] = max(inc ++, v[i]);
            else 
                inc = 1;
        }
        return accumulate(v.begin(), v.end(), n);            //accumulate有三個形參:前兩個指定累加的范圍,第三個是累加的初值。
    }
};

第二種寫法:

class Solution {
public:
    int candy(vector<int>& ratings) {
        int n = ratings.size();
        int i, result = 0;
        vector<int> count(n);      //記錄每個孩子的糖數
        //每一個人至少一個糖果
        for(i = 0;i < n;i++)
            count[i] = 1;

        for(i = 1; i < n ; i++)
        {
            if(ratings[i] > ratings[i-1])
                count[i] = count[i-1] + 1;
        }
        for(i = n-2;i >= 0; i--)
        {
            if(ratings[i] > ratings[i+1] && count[i] <= count[i+1])
                count[i] = count[i+1] + 1;

        }
        //統計糖果數量
        for(i = 0;i < n;i++)
            result += count[i];
        return result;
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容