題目描述:N個孩子坐在一排,每個孩子分配一個等級值,按如下要求給每個孩子分糖:
- 每個孩子至少有一個
- 等級高的孩子比其左右孩子多
問最少需要多少糖
分析:一個方向的比較只能滿足一邊的大小要求,兩次遍歷分別從前到后和從后到前,最后加起來。時間復雜度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;
}
};