LeetCode101 Notizen zum Schreiben von Fragen – Greedy-Algorithmus

135.Süßigkeiten(Hart)

  • Gewohnheit

Ideen

  • 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 )
class Solution {
    
    
public:
    int candy(vector<int>& ratings) {
    
    
        int n = ratings.length();
        int candy = 0;	//初始化candy数目是0
		int eachcandy[n];	//存储当前孩子的糖果数量
		for(int i = 0;i < n; ++i)
			eachcandy[i] = 1;	//初始化为1
		for(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
class Solution {
    
    
public:
    int candy(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;
    }
};

Supongo que te gusta

Origin blog.csdn.net/ZHorcrux/article/details/128705782
Recomendado
Clasificación