„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Zwei-Zeiger- und Schiebefenstermuster

Zwei-Zeiger- und Schiebefenstermuster

Veröffentlicht am 11.09.2024
Durchsuche:938

Two Pointer and sliding window pattern

Zwei-Zeiger- und Schiebefenstermuster

Muster 1: Konstantes Fenster (wie Fenster = 4 oder ein ganzzahliger Wert)

Ermitteln Sie beispielsweise bei einem gegebenen Array von (-ve und ve) Ganzzahlen die maximale Summe für das zusammenhängende Fenster der Größe k.

Muster 2:(Variable Fenstergröße) Größtes Subarray/Teilzeichenfolge mit Beispiel: Summe

  • Ansätze:
    • Brute Force: Generieren Sie alle möglichen Subarrays und wählen Sie das Subarray mit der maximalen Länge mit sum
  • Besser/Optimal: Nutzen Sie zwei Zeiger und ein Schiebefenster, um die Zeitkomplexität auf O(n) zu reduzieren.

Muster 3: Anzahl der Unterarrays/Teilzeichenfolgen, wobei wie sum=k ist.
Dies ist sehr schwer zu lösen, da es schwierig wird, wann man expandiert (rechts) oder wann man schrumpft (links).

Dieses Problem kann mit Muster 2
gelöst werden Zum Lösen von Problemen wie dem Ermitteln der Anzahl von Teilzeichenfolgen, bei denen Summe =k.

  • Dies kann unterteilt werden in

    • Unterarrays finden, bei denen sum
    • Subarray finden, bei dem sum

Muster 4: Finden Sie das kürzeste/minimale Fenster

Verschiedene Ansätze für Muster 2:
Beispiel: Größtes Subarray mit Summe

public class Sample{
    public static void main(String args[]){
        n = 10;
        int arr[] = new int[n];

        //Brute force approach for finding the longest subarray with sum  k) break; /// optimization if the sum is greater than the k, what is the point in going forward? 
            }
        }

Besserer Ansatz mit den beiden Zeigern und dem Schiebefenster

        //O(n n) in the worst case r will move from 0 to n and in the worst case left will move from 0 0 n as well so 2n
        int left = 0;
        int right =0;
        int sum = 0;
        int maxLen = 0;
        while(right k){
                sum = sum-arr[left];
                left  ;
            }
            if(sum 



Optimaler Ansatz:
Wir wissen, dass wir, wenn wir das Subarray finden, seine Länge in maxLen speichern, aber wenn wir beim Hinzufügen von arr[right] die Summe größer als k werden, verkleinern wir derzeit nach links, indem wir sum = sum-arr[left] und left ausführen.
Wir wissen, dass die aktuelle maximale Länge maxLen ist. Wenn wir den linken Index weiter verkleinern, erhalten wir möglicherweise ein weiteres Subarray, das die Bedingung erfüllt ( maxLen hat, dann wird nur maxLen aktualisiert.

Ein optimaler Ansatz besteht darin, die linke Seite nur zu verkleinern, solange die Subarray-Länge größer als maxLen ist, wenn das Subarray die Bedingung (

        int right =0;
        int sum = 0;
        int maxLen = 0;
        while(right k){// this will ensure that the left is incremented one by one (not till the sum




          

            
  

            
        

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/prashantrmishra/two-pointer-and-sliding-window-pattern-4118?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3