Ausführliche Erklärung des Algorithmus: Dreieck von Yang Hui | Zwei geordnete Arrays zusammenführen | Duplikate in den geordneten Arrays löschen


Vorwort: Die diesmal geteilten Themen stammen alle von Likou.com. Sie können Ihre eigenen Herausforderungen auswählen. Detaillierte Links:

118. Yang-Hui-Dreieck – LeetCode

88. Zwei sortierte Arrays zusammenführen – LeetCode

26. Duplikate im geordneten Array entfernen – LeetCode

Inhaltsverzeichnis

1. Yang-Hui-Dreieck

Idee:

Vollständiger Code:

2. Führen Sie zwei geordnete Arrays zusammen

Idee:

Vollständiger Code:

3. Entfernen Sie Duplikate in einem geordneten Array

Idee:

Vollständiger Code:


1. Yang-Hui-Dreieck

Titel:Gegeben eine nicht negative ganze Zahl numRows, erzeugen Sie den ersten Teil des Dreiecks von „Yang Hui“. " a> numRows rows (1 <= numRows <= 30)

Hinweis:Im „Yang-Hui-Dreieck“ ist jede Zahl die Summe der Zahlen oben links und oben rechts

Beispiel eins:

Importieren: numRows = 5
Ausgabe: [[1],[1,1],[1,2,1],[1,3,3,1],[ 1,4,6,4,1]]

 Beispiel 2:

Importieren: numRows = 1
Ausgabe: [[1]]

Idee:

Wir können die Richtung des Dreiecks von Yang Hui ändern und es in einen Leitertyp ändern, der für unser Verständnis möglicherweise besser geeignet ist. Für solche Daten vom Leitertyp denken wir natürlich an ein zweidimensionales Array. So kann das Dreieck von Yang Hui verwendet werden als zweidimensionales Array? Was ist mit der Array-Implementierung?

Für jede Datenzeile sind sowohl die erste als auch die letzte 1, und die verbleibenden Daten sind die Daten an derselben Position in der vorherigen Zeile plus die vorherigen Daten, was bedeutet, dass wir sie bei der Implementierung der Daten in jeder Zeile verwenden müssen. Daten aus der vorherigen Zeile. Um den obigen Prozess effizienter abzuschließen, können wir für den Betrieb eine zweidimensionale Sequenztabelle anstelle eines zweidimensionalen Arrays verwenden.

Nachdem wir uns entschieden haben, eine zweidimensionale Sequenztabelle zu verwenden, müssen wir eine allgemeine Sequenztabelle definieren, um die jeder Zeile entsprechende Sequenztabelle zu speichern, und zwar unter Verwendung der äußeren Schichtfor-Schleife< /span> , um die Elemente jeder Zeile zu bestimmen. Das Obige bestimmt den allgemeinen Rahmen dieser Frage. for-SchleifeBestimmen Sie, wie viele Zeilen es gibt, und verwenden Sie die innere Ebene

Es sind einige Details zu beachten:

Zusammenfassende Beobachtung des Dreiecks von Yang Hui, alle1 Positionen befinden sich am Anfang und Ende jeder Linie, der Anfang ist sehr einfach und die innere Schichtfor-Schleife; ist die Startposition und Wenn wir für das letzte Element seine Koordinaten sorgfältig beobachten, werden wir feststellen, dass die Anzahl der Zeilen und Spalten gleich ist. Dies ist die Schleifenvariable der äußeren j=0 for-Schleife i und innere Schichtfor-SchleifeVariable (j == 0 || j == i) „1“ , wir werden Elemente zur Zeilensequenztabelle hinzufügen ist zusammenfassend gleich, wenn die Schleifenvariable j

Für andere Daten als 1 müssen wir über auf die Daten in der vorherigen Zeile zugreifen. get( i-1) kann die Sequenztabelle der vorherigen Zeile abrufen. Nachdem die Sequenztabelle der vorherigen Zeile abgerufen wurde, wird das j dieser Zeile abgerufen bzw. , um diesen Wert zur Sequenztabelle dieser Zeile hinzuzufügen .add positionieren Elemente und fügen sie dann zusammen. Das Ergebnis der Addition ist das Wert, den wir wollen, und schließlich verwenden Sie einfach j-1 positionieren und

Vollständiger Code:

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ret = new ArrayList<>();
        for (int i = 0; i < numRows; i++) {
            //新定义一行
            List<Integer> row = new ArrayList<>();
            for (int j = 0; j <= i; j++) {
                if (j == 0 || j == i) {
                    row.add(1);
                }else {
                    //添加上一行的数据(上一行的j-1和j位置)
                    row.add(ret.get(i-1).get(j-1) + ret.get(i-1).get(j));
                }
            }
            //每一次将新的一行加入总的二维顺序表中
            ret.add(row);
        }
        return ret;
    }
}

2. Führen Sie zwei geordnete Arrays zusammen

Titel: Geben Sie zwei ganzzahlige Arrays an, die in nicht absteigender Reihenfolge  < angeordnet sind a i=4> und und zwei ganze Zahlen  und  repräsentieren jeweils  . Bitte führen Sie  in  zusammen, damit das zusammengeführte Array auch  in absteigender Reihenfolge angeordnet wird  . nums1 nums2mnnums1nums2 nums2 nums1

Hinweis:Letztendlich sollte das zusammengeführte Array nicht von der Funktion zurückgegeben, sondern im Array gespeichert werden nums1 . Um dieser Situation gerecht zu werden, beträgt die Anfangslänge von nums1 m + n, wobei die ersten m -Elemente die Elemente darstellen, die vorhanden sein sollten zusammengeführt werden, und die letzten n Elemente sind 0 und sollten ignoriert werden. Die Länge von nums2 beträgt n .

Beispiel eins:

Import:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
Beenden:[1,2,2,3,5,6]
Lösung:Nachfragesumme [1,2,3] Summe [2,5,6]. 
Das Ergebnis ist [1,2,2, 3,5,6] 

Beispiel zwei:

Import:nums1 = [1], m = 1, nums2 = [], n = 0
Beenden:[1]
Lösung:Nachfragesumme [1] Summe []. 
Das Ergebnis ist [1] 

 Beispiel drei:

Eingabe:nums1 = [0], m = 0, nums2 = [1], n = 1
Ausgabe: [1]
Erklärung: Die Arrays, die zusammengeführt werden müssen, sind [] und [1]. 
Das kombinierte Ergebnis ist [1]

Idee:

Für ein Array möchten wir es in ein brandneues Array zusammenführen. Wir können zwei Zeiger verwenden, um jeweils auf die beiden Arrays zu zeigen, und dann die beiden Zeiger mit dem kleineren Wert vergleichen und den kleineren Wert in das neue Array einfügen Der Zeiger bewegt sich rückwärts

Es gibt insgesamt 4 Situationen zum Einfügen von Daten, auf die wir uns jeweils einlassen:

  1. nums1 Die Daten von sind kleiner als die Daten von  nums2 : Fügen Sie die Daten von nums1 in das neue Array ein , und nach dem Zeiger pA bewegen
  2. nums1 Die Daten von sind größer als die Daten von  nums2 : Fügen Sie die Daten von nums2 in das neue Array ein , und nach dem Zeiger pB bewegen
  3. nums1 Die Daten von wurden ausgeschlossen, aber nums2 enthält noch Elemente: Fügen Sie die Elemente von nums2 in das neue Array ein und bewegen Sie den Zeiger pB zurück
  4.  nums2 Die Daten von wurden entfernt, aber nums1 enthält noch Elemente: Fügen Sie die Elemente von nums1 in das neue Array ein und bewegen Sie den Zeiger pA zurück

Wir verwenden einewhile-Schleife, um alle Situationsdurchläufe einzubeziehen, und dann fügt jedes Urteil über ein temporäres Element ein Datenelement in ein neues Array ein Variable: Um die Anforderungen der Frage zu erfüllen, wird das Endergebnis in Array 1 überschrieben

Vollständiger Code:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int pA = 0;
        int pB = 0;
        int cur = 0;
        int[] sordNum = new int[m + n];
        while (pA < m || pB < n) {
            if (pA == m) {//nums1已满,放入nums2
                cur = nums2[pB++];
            } else if (pB == n) {//nums2已满,放入nums1
                cur = nums1[pA++];
            } else if (nums1[pA] < nums2[pB]) {//nums1的数据小于nums2
                cur = nums1[pA++];
            } else {//nums1的数据大于等于nums2
                cur = nums2[pB++];
            }
            sordNum[pA + pB - 1] = cur;
        }
        for (int j = 0; j != m + n; ++j) {
            nums1[j] = sordNum[j];
        }
    }
}

3. Entfernen Sie Duplikate in einem geordneten Array

Titel: Geben Sie ein Array nicht streng steigende Anordnung nums , bitte  löschen Sie wiederholte Elemente vor Ort  , sodass jedes Element  nur einmal vorkommt zurück.  bleiben. Geben Sie dann die Anzahl der eindeutigen Elemente in konsistent der Elemente sollte relative Reihenfolge gibt die neue Länge des Arrays nach dem Löschen zurück. Die nums

Beispiel eins:

Importieren:nums = [1,1,2]
Ausgabe:2, nums = [1,2,_]

Beispiel zwei:

Importieren:nums = [0,0,1,1,1,2,2,3,3,4]
Ausgabe:5, Zahlen = [0,1,2,3,4]

Idee:

Für dieLöschung hier können wir es geschickt nutzen. Konkret können wir die sich nicht wiederholenden Elemente vor das setzen Array, und dann geben wir nur diesen Teil der sich nicht wiederholenden Elemente zurück und erreichen so das Ziel der getarnten Löschung

Vollständiger Code:

class Solution {
    public int removeDuplicates(int[] nums) {
        //快慢指针
        int left = 0;
        int right = 1;
        while(right < nums.length){
            if(nums[left] != nums[right]){
                left++;
                nums[left] = nums[right];
            }
            right++;
        }
        return left + 1;
    }
}



  Das war's mit diesem Teilen. Ich hoffe, dass mein Teilen für Sie hilfreich sein kann. Ich freue mich auch über jede Unterstützung. Ihre „Gefällt mir“-Angaben sind die größte Motivation für Blogger, sich zu aktualisieren! Wenn Sie anderer Meinung sind, können Sie gerne aktiv im Kommentarbereich diskutieren und sich austauschen, damit wir gemeinsam lernen und Fortschritte machen können! Wenn Sie relevante Fragen haben, können Sie dem Blogger auch eine private Nachricht senden. Der Kommentarbereich und die privaten Nachrichten werden sorgfältig geprüft. Bis zum nächsten Mal

Ich denke du magst

Origin blog.csdn.net/m0_69519887/article/details/134805409
Empfohlen
Rangfolge