Meine Idee besteht darin, das Array everycandy zu verwenden, um die Anzahl der Bonbons für jedes Kind zu speichern und von Anfang bis Ende zu durchlaufen. Wenn es später abnimmt, wird die Anzahl der Bonbons des aktuellen Kindes + 1 berechnet. Unterbrechen Sie, wenn die gleiche Punktzahl erreicht wird. Wenn Sie auf etwas stoßen, das anfängt zuzunehmen, erhöhen Sie die Anzahl der Bonbons für dieses Kind um +1.
Wahrscheinlich falsche Idee! Ist es nicht ein gieriger Algorithmus? !
Die richtige Idee besteht darin, die Regeln in zwei Richtungen aufzuteilen, eine linke Regel und eine rechte Regel. Erfüllen Sie einfach beide Regeln.
INSEKT
Array-Überlauf Beachten Sie, dass **sizeof und size() in der C++-Syntax völlig unterschiedlich sind! **Wenn Sie die Anzahl der Elemente im Array erhalten möchten, sollten Sie size() und nicht sizeof verwenden! ! ! !
lösen
Meine falsche Lösung ( Array-Überlauf )
classSolution{
public:intcandy(vector<int>& ratings){
int n = ratings.length();int candy =0;//初始化candy数目是0int eachcandy[n];//存储当前孩子的糖果数量for(int i =0;i < n;++i)
eachcandy[i]=1;//初始化为1for(int i =0; i < n;i++){
for(int j =1; j < n-i;++j){
if(ratings[i+j-1]<= ratings[i+j]){
break;}else
eachcandy[i]++;}}for(int i =0; i < n;++i)
candy+=eachcandy[i];return candy;}};
korrekte Antwort
classSolution{
public:intcandy(vector<int>& ratings){
int n = ratings.size();
vector<int>left(n);for(int i =0; i < n; i++){
if(i >0&& ratings[i]> ratings[i -1]){
left[i]= left[i -1]+1;}else{
left[i]=1;}}int right =0, ret =0;for(int i = n -1; i >=0; i--){
if(i < n -1&& ratings[i]> ratings[i +1]){
right++;}else{
right =1;}
ret +=max(left[i], right);}return ret;}};