Fragen zum Leetcode-Pinsel (2)

Liebe Freunde, es ist wieder ein neuer Tag, wie geht es euch? Heute ist der zweite Artikel meiner Leedcode-Putzserie, also lass uns ohne weiteres direkt zu unserem heutigen Thema übergehen.

gültige Klammern

Effektive Klammern im Leetcode

Themenanforderungen

Bestimmen Sie bei einem String s, der nur aus '(', ')', '{', '}', '[', ']' besteht, ob der String gültig ist.

Eine gültige Zeichenfolge muss Folgendes erfüllen:

Eine öffnende Klammer muss mit einer schließenden Klammer des gleichen Typs geschlossen werden.
Öffnende Klammern müssen in der richtigen Reihenfolge geschlossen werden.
Jede schließende Klammer hat eine entsprechende öffnende Klammer des gleichen Typs.

Use-Case-Eingabe

Beispiel 1:
Eingabe: s = "()"
Ausgabe: wahr

Beispiel 2:
Eingabe: s = "()[]{}"
Ausgabe: wahr

Beispiel 3:
Eingabe: s = "(]"
Ausgabe: false

Ideen hinterfragen

Die Anforderung dieser Frage ist, dass wir beurteilen müssen, ob die angegebenen Klammern zulässig sind, was bedeutet, dass wir, wenn wir auf Klammern stoßen, beurteilen müssen, ob die nächste linke Klammer auf der linken Seite mit der rechten Klammer übereinstimmt. Wir können eine Datenstruktur verwenden: Stack, um dieses Problem zu lösen, denn der Stack ist ein Ende rein, ein Ende raus, dieses Ende wird als oberstes Ende des Stacks bezeichnet, first in first out, last in first out. Also legen wir alle linken Klammern auf den Stapel.Wenn wir auf eine rechte Klammer stoßen, nehmen wir die linke Klammer von der Spitze des Stapels, um zu sehen, ob sie mit der rechten Klammer übereinstimmt. Wenn die Zeichenfolge durchlaufen wird und der Stapel nicht leer ist, bedeutet dies, dass eine nicht übereinstimmende linke Klammer vorhanden ist. Geben Sie „false“ zurück, andernfalls geben Sie „true“ zurück.

Code

bool isValid(char * s){
    
    
    int len = strlen(s);
    //当字符串中没有或者只有一个字符时就直接返回false
    if(len <= 1)
    return false;
    //字符个数为奇数就说明一定有一个未匹配所以就直接返回
    if(len%2 == 1)
    return false;
    //tail记录栈顶的位置
    int tail = 0;
    char* arr = (char*)malloc(len*sizeof(char));
    int i = 0;
    for(int i = 0; i<len; i++)
    {
    
    
        if(s[i] == '(' || s[i] == '[' || s[i] == '{')
        {
    
    
        	arr[tail++] = s[i];
        }
        else
        {
    
    
            if(tail == 0)
            return false;
            if(s[i] == ')')
            {
    
    
                if(arr[tail-1] != '(')
                return false;
            }
            else if(s[i] == ']')
            {
    
    
                if(arr[tail-1] != '[')
                {
    
    
                    return false;
                }
            }
            else
            {
    
    
                if(arr[tail-1] != '{')
                {
    
    
                    return false;
                }
            }
            tail--;
        }
    }
    if(tail == 0)
    return true;
    return false;
}

Bildbeschreibung hier einfügen

zirkulär verknüpfte Liste

leetcode kreisförmige verkettete Liste

Themenanforderungen

Geben Sie den Kopfknotenkopf einer verknüpften Liste an und beurteilen Sie, ob es einen Ring in der verknüpften Liste gibt.

Wenn es einen Knoten in der verknüpften Liste gibt, der durch kontinuierliches Verfolgen des nächsten Zeigers wieder erreicht werden kann, dann gibt es einen Zyklus in der verknüpften Liste. Um den Ring in der gegebenen verketteten Liste darzustellen, verwendet das Auswertungssystem intern die Ganzzahl pos, um die Position anzugeben, an der das Ende der verketteten Liste mit der verketteten Liste verbunden ist (der Index beginnt bei 0). Hinweis: pos wird nicht als Parameter übergeben. Nur um die tatsächliche Situation der verknüpften Liste zu identifizieren.

Gibt wahr zurück, wenn es einen Zyklus in der verknüpften Liste gibt. Andernfalls wird false zurückgegeben.

Use-Case-Eingabe

Beispiel 1:
Bildbeschreibung hier einfügen

Eingabe: Kopf = [3,2,0,-4], Pos = 1
Ausgabe: wahr
Erklärung: Es gibt einen Ring in der verketteten Liste, dessen Ende mit dem zweiten Knoten verbunden ist.

Beispiel 2:
Bildbeschreibung hier einfügen

Eingabe: head = [1,2], pos = 0
Ausgabe: true
Erklärung: Es gibt einen Ring in der verknüpften Liste, dessen Ende mit dem ersten Knoten verbunden ist.

Beispiel 3:
Bildbeschreibung hier einfügen

Eingabe: Kopf = [1], Pos = -1
Ausgabe: Falsch
Erklärung: Es gibt keinen Ring in der verknüpften Liste.

Ideen hinterfragen

Wenn die verkettete Liste einen Ring hat, verwenden wir zwei Zeiger: den schnellen Zeiger und den langsamen Zeiger. Der langsame Zeiger bewegt sich jeweils um einen Knoten und der schnelle Zeiger durch zwei Knoten. Sie werden sich schließlich treffen.

Code

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) {
    
    
    struct ListNode* low = head;
    struct ListNode* fast = head;
    while(fast && fast->next)
    {
    
    
        low = low->next;
        fast = fast->next->next;

        if(low == fast)
        return true;
    }

    return false;
    
}

Bildbeschreibung hier einfügen

Ringliste II

leetcode kreisförmige verkettete Liste||

Themenanforderungen

Wenn der Kopfknoten Kopf einer verknüpften Liste gegeben ist, wird der erste Knoten der verknüpften Liste zurückgegeben, der beginnt, in den Ring einzutreten. Gibt null zurück, wenn die verknüpfte Liste azyklisch ist.

Wenn es einen Knoten in der verknüpften Liste gibt, der durch kontinuierliches Verfolgen des nächsten Zeigers wieder erreicht werden kann, dann gibt es einen Zyklus in der verknüpften Liste. Um den Ring in der gegebenen verketteten Liste darzustellen, verwendet das Auswertungssystem intern die Ganzzahl pos, um die Position anzugeben, an der das Ende der verketteten Liste mit der verketteten Liste verbunden ist (der Index beginnt bei 0). Wenn pos -1 ist, gibt es keine Zyklen in der Liste. Hinweis: pos wird nicht als Parameter übergeben, sondern dient nur dazu, die tatsächliche Situation der verknüpften Liste zu identifizieren.

Die verknüpfte Liste darf nicht geändert werden.

Use-Case-Eingabe

Beispiel 1:

Bildbeschreibung hier einfügen

Eingabe: Kopf = [3,2,0,-4], Pos = 1
Ausgabe: Rückgabe des verketteten Listenknotens mit Index 1
Erläuterung: Es gibt einen Ring in der verketteten Liste, dessen Ende mit dem zweiten Knoten verbunden ist.

Beispiel 2:
Bildbeschreibung hier einfügen

Eingabe: Kopf = [1,2], Pos = 0
Ausgabe: Rückgabe des verketteten Listenknotens mit Index 0
Erläuterung: In der verketteten Liste gibt es einen Ring, dessen Ende mit dem ersten Knoten verbunden ist.

Beispiel 3:
Bildbeschreibung hier einfügen

Eingabe: Kopf = [1], Pos = -1
Ausgabe: Null zurückgeben
Erläuterung: Es gibt keinen Ring in der verknüpften Liste.

Ideen hinterfragen

Unsere Frage erfordert noch das Wissen, ob das obige Urteil eine kreisförmige verkettete Liste ist.Es gibt eine Schlussfolgerung: Wenn sich die schnellen und langsamen Zeiger treffen, lassen Sie die Zeiger am Kopfknoten der verketteten Liste und dem Knoten, auf den sie treffen, eins beginnen Knoten zu einem Zeitpunkt, treffen sie sich schließlich am Eingang der kreisförmigen verknüpften Liste.

Code

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    
    
    struct ListNode* slow = head;
    struct ListNode* fast = head;

    while(fast && fast->next)
    {
    
    
        slow = slow->next;
        fast = fast->next->next;

        if(slow == fast)
        {
    
    
            struct ListNode* meet = slow;

            while(head != meet)
            {
    
    
                meet = meet->next;
                head = head->next;
            }
            return meet;
        }
    }
    return NULL;
}

Bildbeschreibung hier einfügen

Je suppose que tu aimes

Origine blog.csdn.net/m0_73888323/article/details/130030612
conseillé
Classement