Erste Einführung in Algorithmen · Schiebefenster (1)

Inhaltsverzeichnis

 Vorwort:

Subarray mit minimaler Länge

Fragenanalyse

Algorithmusprinzip

Algorithmen schreiben

Mindestzeichenfolge ohne Wiederholungslänge

Fragenanalyse

Algorithmusprinzip

Algorithmen schreiben


 Vorwort:

Zu Beginn dieses Artikels stellen wir das Thema des Schiebefenster-Algorithmustyps vor. Das Schiebefenster ist eigentlich ein Doppelzeiger, die zuvor eingeführten Doppelzeiger bewegen sich jedoch aufeinander zu.

Schiebefenster bewegen sich in die gleiche Richtung:

In diesem Artikel wird die grundlegende Verwendung von Schiebefenstern anhand von zwei Themen vorgestellt:

209. Subarray mit minimaler Länge – LeetCode

3. Der längste Teilstring ohne wiederholte Zeichen – LeetCode

Die Einführung erfolgt in drei Schritten, der zweite Schritt ist das Algorithmus-Schreiben. Ebenso werden wir im Problemanalyse-Teil prüfen, ob es eine gewaltsame Lösung gibt , gehen wir zum ersten Schritt.


Subarray mit minimaler Länge

Fragenanalyse

Die Anforderung der Frage besteht darin, ein kontinuierliches Intervall zu finden, bei dem die Summe der Werte im Intervall größer oder gleich dem Ziel ist. Wenn es ein Intervall dieses Typs gibt, sollte der Rückgabewert die Mindestlänge haben diese Intervalle. Wenn kein solches Subarray vorhanden ist, sollte 0 zurückgegeben werden.

Dann gibt es zwei Beispiele. Können wir dieses Problem also gewaltsam lösen? Natürlich ist es möglich.

Wir müssen nur alle Intervalle finden, die diese Bedingung erfüllen, und ihre Länge bestimmen. Die Zeitkomplexität beträgt jedoch definitiv O(N^2), und bei dieser Frage wird es eine Zeitüberschreitung geben, sodass ich interessiert bin ihre eigenen.

Warum kann diese Frage auf den ersten Blick ein Schiebefenster verwenden?

Da ein kontinuierlicher Raum erforderlich ist , gilt als Faustregel: Wenn wir auf ein Problem stoßen, das einen kontinuierlichen Raum erfordert, können wir uns genauso gut dem Schiebefenster zuwenden.

Kommen wir nun zum Teil des Algorithmusprinzips.

Algorithmusprinzip

Das Wesen des Schiebefensters besteht darin, dass sich zwei Zeiger in die gleiche Richtung bewegen. Durch die Bewegung dieser beiden Zeiger bestimmen wir, ob die Summe der Intervalle erfüllt ist, und wenn ja, vergleichen wir die Längen.

Was also, wenn Sie ein Schiebefenster verwenden?
Die Startpunkte der beiden Zeiger sollten zunächst gleich sein. Wenn die Positionen der beiden Zeiger nicht gleich sind, müssen wir eine zusätzliche Schleife hinzufügen, um speziell die Summe dieses Intervalls zu ermitteln.

int left = 0, right = 0;

Das ist sicher, dann können wir uns für Schiebefenster zwei Substantive merken, eines ist das Eingangsfenster und das andere ist das Ausgangsfenster. Worum geht es in unserem Thema? Wann man das Fenster betritt und was das Ausgangsfenster ist.

Das Betreten des Fensters bedeutet, dass die Summe der Intervalle <Ziel ist, sodass mehr Zahlen beteiligt sein müssen. Deshalb müssen wir nicht sortieren. Die Frage selbst erfordert positive ganze Zahlen, wir müssen also nur sicherstellen, dass die Zahl so ist groß wie möglich.

Außerhalb des Fensters bedeutet, dass die Summe der Intervalle > Ziel ist. Gehen Sie einfach aus dem Fenster und beurteilen Sie die minimale Länge, die darin vorhanden ist.

Das Grundprinzip besteht darin, dass Sie das Problem erfolgreich lösen können, indem Sie ein- und aussteigen.

Algorithmen schreiben

class Solution 
{
public:
    int minSubArrayLen(int target, vector<int>& nums) 
    {
        int ans = INT_MAX, left = 0, right = 0 ,sum = 0;
        for(;right < nums.size();right++)
        {
            sum += nums[right];
            while(sum >= target) 
            {
                ans = min(ans,right - left + 1);//如果ans为0 那么这一步永远都是0
                sum -= nums[left++];
            }
        }
        return ans == INT_MAX ? 0 : ans;
    }
};

Der widerliche Punkt dieser Frage ist jedoch, dass, wenn die Anfangslänge nicht als sehr große Zahl definiert ist, bei der Beurteilung und beim Vergleich die kleinste Zahl nicht durch min ermittelt werden kann. Daher sollten wir ans als INT_MAX definieren, solange es groß ist Nummer, es ist in Ordnung.

An diesem Punkt ist die Analyse des Themas abgeschlossen.


Mindestzeichenfolge ohne Wiederholungslänge

Fragenanalyse

Die Frage ist sehr kurz. Die Übergabebedingung besteht darin, die Länge der längsten Zeichenfolge ohne wiederholte Zeichen zurückzugeben. Die in der Frage angegebenen Anforderungen sind also:

Um festzustellen, ob Duplikate vorhanden sind, benötigen wir eine Methode, um festzustellen, ob eine Zuordnung vorliegt. Wir können hier auch eine Hash-Karte verwenden und ein Array verwenden, um eine Hash-Tabelle zu imitieren könnte genauso gut feststellen, ob Gewalt in der Lösung steckt.

Das muss vorhanden sein. Die zweite Schleife findet das letzte Element und ermittelt, ob der Mapping-Wert größer als 1 ist. Die Zeitkomplexität beträgt definitiv O(N^2), was passabel ist.

Da es sich bei dieser Frage jedoch um ein Intervall handelt, können wir sie genauso gut mit einem Schiebefenster beantworten.

Algorithmusprinzip

Das Schiebefenster der vorherigen Frage ist das Subarray mit der kleinsten Länge. Die Beurteilungsbedingung ist größer oder gleich >= Ziel. Die Beurteilungsbedingung dieser Frage ist, ob die Hash-Karte größer als 1 ist. Daher wird eine Schlussfolgerung gezogen : Es gibt drei Fragen, bei denen Schiebefenster verwendet werden. Der erste Schritt besteht darin, das Fenster zu betreten, der zweite darin, das Fenster zu beurteilen, und der dritte darin, das Fenster zu verlassen .

Die folgenden Fragen verwenden alle dieses Verfahren sehr streng.

Dann besteht unsere Beurteilungsmethode auch darin, die Hash-Zuordnung zu verwenden. Wenn die Beurteilungszuordnung größer als 1 ist, werden die entsprechenden Ans aufgezeichnet wird ebenfalls aufgezeichnet.

Zum Schluss kehren Sie einfach zurück.

Algorithmen schreiben

class Solution 
{
public:
    int lengthOfLongestSubstring(string s) 
    {
        int hash[256] = { 0 }, ans = 0;
        for(int left = 0, right = 0;right < s.size();right++)
        {
            hash[s[right]]++;
            while(hash[s[right]] > 1)
            {
                hash[s[left++]]--;
            }
            ans = max(ans,right - left + 1);
        }
        return ans;
    }
};

Der Anfang des Schiebefensters ist vorbei~


Danke fürs Lesen!

Ich denke du magst

Origin blog.csdn.net/2301_79697943/article/details/142713599
Empfohlen
Rangfolge