動態規劃演算法之最少糖果問題
阿新 • • 發佈:2019-01-23
題目描述
N個孩子站在一條線上,給每個孩子分配一個數字,你需要滿足下面的要求給孩子們分糖果:
- 每個孩子至少有一個糖果
- 數字更大的孩子要比旁邊孩子的糖果多
你至少需要準備多少糖果分給孩子們?
題目解析
一開始看到這個題目的時候聯想到了數,因為沒看出來是動態規劃的題目,所以想出了一個常數時間複雜度的演算法,即從左至右遍歷陣列即可得出答案。
非動態規劃法大致思路為:從左至右遍歷陣列,(使用int inc和int dec表示當前數字連續變大的個數以及連續變小的個數)如果當前的數字比之前的數字大,那麼inc=1,然後將inc加到sum中;如果當前的數字比之前的數字小,那麼求遞減的和,當遞減結束時,去重。
動態規劃法大致思路:
非動態規劃法C++程式碼實現
class Solution {
public:
int candy(vector<int> &ratings) {
int inc = 0, dec = 0;
int sum = ratings.size();
for (int i = 1;i < ratings.size();i++) {
if (ratings[i] > ratings[i-1]) {
inc += 1;
sum += inc;
dec = 0 ;
} else if (ratings[i] < ratings[i-1]) {
for (; ratings[i] < ratings[i-1] && i < ratings.size();i++) {
dec += 1;
sum += dec;
}
sum -= inc > dec ? dec : inc; // 去重
inc = 0 ;
i--;
} else {
inc = 0;
dec = 0;
}
}
return sum;
}
};
/*
* runtime:20ms
* memory :532k
* author :anonymous
* date :2018年2月22日18:03:24
*/