[Fragen zum Likou-Pinsel | Tag 17]

Inhaltsverzeichnis

Vorwort:

55. Springspiel – LeetCode

45. Springspiel II – LeetCode

Zusammenfassen:


Vorwort:

        Heutzutage sind beide Typen gierige Algorithmen, ich hoffe, etwas zu gewinnen

55. Springspiel – LeetCode

Bei einem Array nicht negativer Ganzzahlen  nums befinden Sie sich zunächst am  ersten Index des Arrays  .

Jedes Element im Array stellt die maximale Länge dar, über die Sie an dieser Position springen können.

Stellen Sie fest, ob Sie den letzten Index erreichen können.

Tatsächlich konzentriert sich diese Frage auf das Denken. Viele Leute betrachten diese Frage als eine Idee eines gierigen Algorithmus, aber sie alle tappen in eine Denkfalle:

Wie wähle ich den nächsten Schritt am aktuellen Standort aus, damit er endlich den Zielpunkt erreichen kann?

Aber wenn Sie so denken, geraten Sie in eine schwierige Problemlösungsidee, nämlich in die Frage, wie Sie den nächsten Schritt wählen sollen, denn manchmal ist die Anzahl der gierigen Schritte zu groß, um den Punkt zu erreichen.

Machen wir uns also keine Gedanken darüber, wie es weitergeht, sondern schauen wir uns die Berichterstattung an . Ich werde Ihnen ein Beispiel mit einem Beispiel geben:

 Wir können die Abdeckung mit horizontalen Linien darstellen:

 Es ist deutlich zu erkennen, dass 3 4 abgedeckt hat. Dann können wir wissen, dass wir in diesem Array zum letzten Punkt gehen können.

Nehmen wir ein weiteres Gegenbeispiel:

 Wir können sehen, dass die Elemente dieses Arrays (mit Ausnahme des letzten Elements) den letzten Punkt nicht abdecken können. Daher ist es unmöglich, den letzten Punkt zu erreichen, egal wie wir vorgehen.

Basierend auf dieser Idee können wir daher die Lösung für diese Frage schreiben:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int size =nums.size();
        int cover=0;
        for(int i=0;i<=cover;i++)
        {
           cover=max(nums[i]+i,cover);
            if(cover>=size-1)
            {
                return true;
            }         
        }
        return false;
    }
};

45. Springspiel II – LeetCode

Gegeben sei ein nullindiziertes ganzzahliges Array mit Zahlen der Länge n. Die Anfangsposition ist nums[0].

Jedes Element nums[i] stellt die maximale Länge dar, um vom Index i vorwärts zu springen. Mit anderen Worten: Wenn Sie sich bei nums[i] befinden, können Sie zu jedem beliebigen nums[i + j] springen:

0 <= j <= nums[i] 
i + j < n
gibt die minimale Anzahl von Hops zurück, um nums[n - 1] zu erreichen. Generierte Testfälle können nums[n - 1] erreichen.

 Diese Frage ist ebenfalls eine Idee eines gierigen Algorithmus, aber viele Menschen sind gierig nach dem falschen Zweck. In der vorherigen Frage haben wir den Abdeckungsbereich eingeführt. Tatsächlich sind wir unter der Voraussetzung der minimalen Anzahl von Sprüngen nicht nach den meisten Schritten, sondern nach dem größten Abdeckungsbereich gierig .

Aus dieser Problemlösungsidee können wir schließen:

class Solution {
public:
    int jump(vector<int>& nums) {
        int size =nums.size();
        int cur=0;
        int next=0;
        int count=0;
        if(size==1)
        {
            return 0;
        }

        for(int i=0;i<size;i++)
        {
            next=max(i+nums[i],next);
            if(i==cur)
            {
                if(cur!=size-1)
                {
                    count++;
                    cur=next;
                }
                if(cur>=size-1)
                {
                    break;
                }
            }
        }
        return count;
    }
    
};

Lassen Sie mich eine detaillierte Erklärung geben: Erstellen Sie zunächst vier Variablen: Größe gibt die Länge an, die zum Erreichen des Zielpunkts erforderlich ist, cur gibt die Abdeckung des aktuellen Punkts an, next gibt die Abdeckung des Punktes an, zu dem wir gerade springen, und count zeichnet die Anzahl der Sprünge auf.

Danach suchen wir basierend auf der Abdeckung des aktuellen Standorts rückwärts nach der nächstgrößeren Abdeckung, die die Funktion der drei Wenns in der for-Anweisung ist

  • if(i==cur) wird verwendet, um zu beurteilen, ob wir die nächste maximale Abdeckung innerhalb der aktuellen Abdeckung beurteilt haben.
  • if(cur!=size-1) wird verwendet, um zu beurteilen, ob der aktuelle Abdeckungsbereich den Zielpunkt nicht abdeckt. Wenn nicht, bedeutet dies, dass er nicht abgedeckt ist. Wenn er nicht abgedeckt ist, gehen wir zum nächstgrößeren Abdeckungspunkt (cur=next) und geben die Anzahl der Sprünge +1 (count++) an.
  • if(cur>=size-1) wird verwendet, um zu beurteilen, ob der aktuelle Abdeckungsbereich den Zielpunkt abgedeckt hat. Wenn er abgedeckt wurde, bedeutet dies, dass die Anzahl der Sprungschritte zu diesem Zeitpunkt bereits die kürzeste Anzahl von Sprungschritten ist. Verlassen Sie die Schleife direkt und geben Sie das Ergebnis aus.

Zusammenfassen:

Das Thema des Greedy-Algorithmus ändert sich ständig. Wir müssen noch mehr Ideen zum Greedy-Algorithmus durch viele Fragen beherrschen.

Wenn meine Inhalte für Sie hilfreich sind, liken Sie sie bitte, kommentieren und setzen Sie ein Lesezeichen . Die Schöpfung ist nicht einfach, die Unterstützung aller ist meine Motivation, durchzuhalten!

 

 

Je suppose que tu aimes

Origine blog.csdn.net/fckbb/article/details/131688674
conseillé
Classement