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
Inhaltsverzeichnis
2. Führen Sie zwei geordnete Arrays zusammen
3. Entfernen Sie Duplikate in einem geordneten Array
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
nums2
m
n
nums1
nums2
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:
nums1
Die Daten von sind kleiner als die Daten vonnums2
: Fügen Sie die Daten vonnums1
in das neue Array ein , und nach dem Zeiger pA bewegennums1
Die Daten von sind größer als die Daten vonnums2
: Fügen Sie die Daten vonnums2
in das neue Array ein , und nach dem Zeiger pB bewegennums1
Die Daten von wurden ausgeschlossen, abernums2
enthält noch Elemente: Fügen Sie die Elemente vonnums2
in das neue Array ein und bewegen Sie den Zeiger pB zurück-
nums2
Die Daten von wurden entfernt, abernums1
enthält noch Elemente: Fügen Sie die Elemente vonnums1
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