Palindrome Bağlı Siyahı Leetcode Həlli

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Çiy kərpic Amazon alma Bloomberg Capital One Cisco Facebook google Ağır Intel IXL microsoft Nutanix Kahin Paytm Snapchat Über Yandex
alqoritmlər kodlaşdırma müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutions Bağlı siyahı İki işarəBaxılıb 36

"Palindrome Bağlı Siyahı" problemində verilmiş tək bir tamın olub olmadığını yoxlamalıyıq əlaqəli siyahı palindromdur ya yox.

misal

List = {1 -> 2 -> 3 -> 2 -> 1}
true

İzahat # 1: Başlanğıcdan və arxadakı bütün elementlər dəyər baxımından eyni olduğundan siyahı palindromdur.

List = {1 -> 2 -> 3 -> 4 -> 5}
false

İzahat # 2: Siyahı palindrom deyil, çünki irəli və arxadakı elementlər eyni deyil.

Yanaşma (Recursion)

Palindrom xüsusiyyətlərini yoxlamaq üçün massivin arxasındakı qovşaqların təfərrüatlarına sahib olmağımız lazım olduğunu asanlıqla başa düşürük. Bu vəziyyətdə bir tək əlaqəli siyahı, hər hansı bir düyünə çatmaq üçün yalnız irəli təkrarlaya biləcəyimiz deməkdir Beləliklə, qovşaqları arxadan tutmaq üçün bəzi məlumat quruluşundan istifadə etmək vacibdir, məsələn qalaq mümkün olan bir seçimdir, çünki ən son qovluğu yuxarı hissədə saxlayır. Eyni şəkildə rekursiyadan da istifadə edə bilərik. Rekursiya, qovşaq dəyərlərini tərs qaydada almaq üçün zərifdir. Daha yaxşı başa düşmək üçün aşağıdakı ümumi psevdokodu nəzərdən keçirin:

inorderTraversal(root)
{
    if(root == null)
        return;
    inorderTraversal(root.left);
    print(root.data);
    inorderTraversal(root.right);
}

Yuxarıdakı kod əvvəlcə yazdırır Zaman ağacdakı qovşaqlar, çünki funksiyanı nodun dəyərini yazdırmadan əvvəl hər hansı bir kökündən sol uşaqlarına getmək funksiyasını təkrarən çağırırıq. Eynilə, istifadə edə bilərik rekursiya əvvəlcə son qovşaqlara getmək və funksiya geri döndüyündə qovşaq dəyərlərini tərs qaydada əldə edəcəyik. İrəli təkrarlamaq üçün rekursiyadan təsirlənməyən dəyişəndən istifadə edəcəyik. Bu şəkildə, elementləri müqayisə etmək üçün irəli təkrarlayıcı dəyərini və rekursiya yolu ilə əldə edilmiş tərs qovşaq dəyərini müqayisə edə bilərik.

Alqoritm

  1. Bir funksiya isPalindrome () ilə bir siyahının olub olmadığını qaytarmaq üçün istifadə olunur baş palindromdur ya yox
  2. Adlı bir sinif üzvünü elan edirik ön qabaqcıl təkrarlamalar üçün qovşaqları saxlamaq
  3. In isPalindrom ():
    • Initialize ön = baş
    • geri palindromeCheck (baş)
  4. In palindromeCheck (cari):
    • If cari is null:
      • qayıtmaq doğru
    • If palindromeCheck (cari.next) is saxta:
      • qayıtmaq saxta
    • If cari.value is yox bərabərdir ön.dəyər
      • qayıtmaq saxta
    • ön artım:
      • ön = ön
    • qayıtmaq doğru bütün yoxlamaları həyata keçirdiyimiz kimi
  5. Nəticəni çap edin

Palindrome Bağlı Siyahı Leetcode həllinin tətbiqi

C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;
struct listNode
{
    int value;
    listNode* next;
    listNode(int x)
    {
        value = x;
        next = NULL;
    }
};

bool palindromeCheck(listNode* head)
{
    if(head == NULL)
        return true;
    if(!palindromeCheck(head->next))
        return false;
    if(front->value != head->value)
        return false;
    front = front->next;
    return true;
}

bool isPalindrome(listNode* head)
{
    front = head;
    return palindromeCheck(head);
}

int main()
{
    listNode* head = new listNode(1);
    head->next = new listNode(2);
    head->next->next = new listNode(3);
    head->next->next->next = new listNode(2);
    head->next->next->next->next = new listNode(1);

    cout << (isPalindrome(head) ? "true\n" : "false\n");
    return 0;
}

Java Proqramı

class listNode
{
    int value;
    listNode next;
    listNode(int x)
    {
        value = x;
        next = null;
    }
}

class palindrome_linked_list
{
    static listNode front;
    public static void main(String args[])
    {
        listNode head = new listNode(1);
        head.next = new listNode(2);
        head.next.next = new listNode(3);
        head.next.next.next = new listNode(2);
        head.next.next.next.next = new listNode(1);

        System.out.println((isPalindrome(head)) ? "true" : "false");
    }

    static boolean palindromeCheck(listNode head)
    {
        if(head == null)
            return true;
        if(!palindromeCheck(head.next))
            return false;
        if(front.value != head.value)
            return false;
        front = front.next;
        return true;
    }

    static boolean isPalindrome(listNode head)
    {
        front = head;
        return palindromeCheck(head);
    }
}
true

Palindrome Bağlı Siyahı Leetcode Həllin Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

O (N) rekursiyadan istifadə edərək siyahını bir dəfə keçdikdə. Burada N = siyahıda qovşaq sayı.

Kosmik Mürəkkəblik

O (N) yaratdığımız hər bir düyünü yoxlamaq üçün rekursiv bir funksiya dediyimiz kimi N yaddaşdakı yığma çərçivələr.

Yanaşma (Digər Yarımın tərsinə)

Rekursiyada istifadə olunan yerdən qurtulmanın yeganə yolu verilmiş siyahını yerində dəyişdirməkdir. Bağlı siyahının ikinci yarısını tərsinə çevirdik və sonra uyğun dəyərlərin bərabər olub olmadığını yoxlamaq üçün hər iki hissə üçün iki irəli təkrarlayıcı istifadə edirik. Bu proses üçün aşağıdakılara ehtiyacımız var:

  • siyahının ortasını tapın ki, ikinci yarını geri çevirə bilək.
  • siyahının ikinci yarısını tərsinə çevirmək üçün bir funksiya yaradın
  • birinci və ikinci yarının bərabər olub olmadığını yoxlayın

Yuxarıda deyilənlərin hamısı xətti vaxtda edilə bilər. Bağlı siyahını tərs çevirdikdən sonra ikinci hissə tamamlanana qədər yoxlamağa başlayırıq.

Palindrome Bağlı Siyahı Leetcode HəlliPin

Alqoritm

  1. If baş is null:
    • doğru qayıt
  2. Bağlı siyahının ortasını istifadə edərək tapın middleOfList (başfunksiyası:
    • İki göstəricini başlatın yavaşsürətli hər ikisi də siyahının başını göstərir
    • Qədər sürətli.növbətisürətli.növbəti.növbəti hər ikisi yox sıfır:
      1. Artım yavaş 1-ci ilə qədər yavaş = yavaş.sonrunda
      2. Artım sürətli 2-ci ilə qədər sürətli = sürətli.next.next
    • yavaş İndi göstərici siyahının ortasına işarə edir
    • qayıtmaq yavaş
  3. İndi siyahının ikinci yarısını axtarırıq reverseList (baş = ortada) funksiyası
    • Başlanğıc prev = null
    • isə baş sıfır deyil:
      • Növbəti düyünü müvəqqəti dəyişən kimi saxlayın sonrakı
      • İstifadə edərək göstərici istiqamətini tərs çevirin head.next = əvvəlki
      • əvvəlki = baş
      • İstifadə edərək siyahıda irəliləyin baş = növbəti
    • qayıtmaq prev
  4. İndi iki göstəricini dəqiqləşdirin ptr1ptr2 hər iki yarıdan təkrarlamaq üçün:
    1. ptr1 = baş
    2. ptr2 = başlanğıc ikinci yarının
    3. isə ptr2 sıfır deyil:
      1. if ptr1.dəyər ilə bərabər deyil ptr2.dəyər
        1. qayıtmaq saxta
    4. qayıtmaq doğru birinci və ikinci yarıda hər bir nodu yoxladığımız kimi
  5. Nəticəni çap edin

Palindrome Bağlı Siyahı Leetcode həllinin tətbiqi

C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;
struct listNode
{
    int value;
    listNode* next;
    listNode(int x)
    {
        value = x;
        next = NULL;
    }
};

listNode* middleOfList(listNode* head)
{
    listNode *slow = head , *fast = head;
    while(fast->next != NULL && fast->next->next != NULL)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

listNode* reverseList(listNode* head)
{
    listNode *prev = NULL;
    while(head != NULL)
    {
        listNode* next = head->next;
        head->next = prev;
        prev = head;
        head = next;
    }
    return prev;
}

bool isPalindrome(listNode* head)
{
    if(head == NULL)
        return true;
    listNode* middleNode = middleOfList(head);
    listNode* startOfSecondHalf = reverseList(middleNode->next);

    listNode *ptr1 = head , *ptr2 = startOfSecondHalf;
    while(ptr2 != NULL)
    {
        if(ptr1->value != ptr2->value)
            return false;
        ptr1 = ptr1->next;
        ptr2 = ptr2->next;
    }
    return true;
}

int main()
{
    listNode* head = new listNode(1);
    head->next = new listNode(2);
    head->next->next = new listNode(3);
    head->next->next->next = new listNode(2);
    head->next->next->next->next = new listNode(1);

    cout << (isPalindrome(head) ? "true\n" : "false\n");
    return 0;
}

Java Proqramı

class listNode
{
    int value;
    listNode next;
    listNode(int x)
    {
        value = x;
        next = null;
    }
}

class palindrome_linked_list
{
    public static void main(String args[])
    {
        listNode head = new listNode(1);
        head.next = new listNode(2);
        head.next.next = new listNode(3);
        head.next.next.next = new listNode(2);
        head.next.next.next.next = new listNode(1);

        System.out.println((isPalindrome(head)) ? "true" : "false");
    }

    static listNode middleOfList(listNode head)
    {
        listNode slow = head , fast = head;
        while(fast.next != null && fast.next.next != null)
        {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }

    static listNode reverseList(listNode head)
    {
        listNode prev = null;
        while(head != null)
        {
            listNode next = head.next;
            head.next = prev;
            prev = head;
            head = next;
        }
        return prev;
    }

    static boolean isPalindrome(listNode head)
    {
        if(head == null)
            return true;
        listNode middleNode = middleOfList(head);
        listNode startOfSecondHalf = reverseList(middleNode.next);

        listNode ptr1 = head , ptr2 = startOfSecondHalf;
        while(ptr2 != null)
        {
            if(ptr1.value != ptr2.value)
                return false;
            ptr1 = ptr1.next;
            ptr2 = ptr2.next;
        }
        return true;
    }
}
true

Palindrome Bağlı Siyahı Leetcode Həllin Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

O (N) siyahının ortasını tapmaq, düzəltmək və hər iki yarıyı müqayisə etmək üçün xətti döngələrdən istifadə etdikdə. Burada, N = siyahının ölçüsü.

Kosmik Mürəkkəblik

O (1) yalnız daimi əlavə yerdən istifadə etdiyimiz üçün.

Şərh yaz

Translate »
1