題目大概意思就是給你一些孩子的rating,這些孩子站成一個直線,相鄰的孩子rating高的一定要比rating低的孩子的candy多
所有孩子至少有一個candy。
問最少發多少個candy(好摳)
最少呢,我們當然就是保證再滿足限制條件下盡量少發candy給孩子。
那限制條件當然來自相鄰的孩子。
如果我比你高,我就比你多1,最低的孩子為1.
從左往右掃瞄一次,波谷為1,然后依次加1到波峰,再到波谷時又是1
這樣就滿足所有rating高的比左邊rating低的孩子的candy多了。
然后再從右往左來一次,一樣的,不弱還要多個條件就是,因為剛才算了一次candy[i]了
這次candy[i]要取最大的才能同同時滿足這兩個條件。
然后就ok啦,兩邊都滿足了!
class Solution {
public:
int candy(vector<int> &ratings) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int cap = ratings.size();
int* candy = new int[cap];
fill(candy , candy + cap , 0);
int k = 1;
for(int i = 1 ; i < cap ; i++){
if(ratings[i] > ratings[i - 1]){
candy[i] = max(k++ , candy[i]);
}else{
k = 1;
}
}
k = 1;
for(int i = cap -2 ; i >= 0 ; i --){
if(ratings[i] > ratings[i + 1]){
candy[i] = max(k++ , candy[i]);
}else{
k = 1;
}
}
int ans = cap;
for(int i = 0 ; i < cap ; i++) ans += candy[i];
return ans;
}
};
PS。new的candy數組一定要初始化啊,我以為會初始化為0,然后莫名的錯了幾次
class Solution { public: int candy(vector<int> &ratings) { vector<int> candy(ratings.size(), 1); int height = 1; for (int i = 1; i < ratings.size(); i++) { if (ratings[i] > ratings[i - 1]) { candy[i] = max(++height, candy[i]); } else { height = 1; } } height = 1; for (int i = ratings.size() - 2; i >= 0; i--) { if (ratings[i] > ratings[i + 1]) { candy[i] = max(++height, candy[i]); } else { height = 1; } } int ans = 0; for (int i = 0; i < ratings.size(); i++) { ans += candy[i]; } return ans; } };
