Paskalın Üçbucağı II Leetcode Həlli

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Amazon microsoft
alqoritmlər Geyim kodlaşdırma Dinamik proqramlaşdırma müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutions RiyaziyyatBaxılıb 99

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Problem bəyanat

Bu problemdə bizə Paskal Üçbucağının Sıra göstəricisi (i) verilmişdir. İth sıra dəyərlərini ehtiva edən xətti bir sıra yaratmalı və onu qaytarmalıyıq. Sıra indeksi 0-dan başlayır.
Paskalın üçbucağının hər bir ədədin birbaşa üstündəki iki ədədin cəm olduğu bir üçbucaq olduğunu bilirik.

Paskalın Üçbucağı II Leetcode HəlliPin

misal

rowIndex = 3
[1,3,3,1]
rowIndex = 0
[1]

Bildiyimiz kimi paskalın üçbucağındakı hər bir dəyər binomial əmsalıdır (nCr), burada n sətir, r isə bu dəyərin sütun indeksidir.

Bütün sətirləri 0 sətir indeksindən paskal üçbucağının verilən sətir indeksinə qaytarmalı olduğumuz oxşar problemi müzakirə etdik. Paskal Üçbucağı Leetcode

Ancaq bu problemdə yalnız indeks verilmiş bir sıra qaytarmalıyıq.
Burada bu problemin həlli üçün üç yanaşmanı müzakirə edəcəyik:

Yanaşma 1 (Brute Force Recursion)

Bu üçbucaqdakı hər bir ədədin birbaşa üstündəki iki ədədin cəmidir. yəni
Num (sıra, kol) = Say (sıra-1, kol) + Say (sıra-1, kol-1).
Beləliklə, həmin satırın hər bir sütun indeksi üçün Num (rowIndex, j) funksiyasını dəfələrlə çağıra bilərik və əmələ gələn siyahını qaytara bilərik.

Gördüyümüz kimi Num (i, j) tapmaq üçün rekursiv yanaşma tərtib etdik. İndi bunun üçün bəzi əsas hallar var:

  • Birinci cərgədəki dəyər 1 olacaqdır. Beləliklə sıra = 0 üçün Num (sıra,…) = 0 olur.
  • İlk sütundakı dəyər 1 olacaqdır. Buna görə col = 0, Num (…, col) = 0 olur.
  • Hər sətrin son dəyəri 1-ə bərabər olacaqdır. Buna görə col = sıra = k, Num (k, k) = 0.

Paskalın Üçbucağı II Leetcode Həlli üçün tətbiqetmə

C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;

int nCr(int n,int r)
{
    if(n==0 || r==0 || r==n)
        return 1;

    return nCr(n-1,r-1)+ nCr(n-1,r);
}


vector<int> getRow(int rowIndex) 
{
    vector<int> res(rowIndex+1);

    for(int i=0;i<=rowIndex;i++)
        res[i]= nCr(rowIndex,i);

    return res;

}

int main() 
{
    int rowIndex=3;
    vector<int> ans= getRow(rowIndex);
    for(auto val:ans) cout<<val<<" ";
    
    cout<<endl;
    return 0; 
}
1 3 3 1

Java Proqramı

import java.util.*;

class Rextester{
    
    static int nCr(int n,int r)
    {
        if(n==0 || r==0 || r==n)
            return 1;

        return nCr(n-1,r-1)+ nCr(n-1,r);
    }

    public static List<Integer> getRow(int rowIndex) 
    {
       List<Integer> res=new ArrayList<Integer>();
        for(int i=0;i<=rowIndex;i++)
            res.add(nCr(rowIndex,i));

        return res;
    }

  public static void main(String args[])
    {
       	int rowIndex=3;
        List<Integer> ans= getRow(rowIndex);
        for(int val:ans)  System.out.print(val+" ");
    }
}
1 3 3 1

Paskalın Üçbucağı II Leetcode Həlli üçün Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

O (2 ^ k): burada k verilən Satır İndeksidir.
Num (i, j) üçün rekursiyanı Num (i-1, j) + Num (i-1, j-1) kimi çağırırıq. Beləliklə, Num (n, r) tapmaq üçün vaxt nCr olacaqdır.
Bu rekursiv funksiyanı verilmiş sətrin (k) bütün sütun indeksi üçün çağırırıq .ie
kC0 + kC1 + kC2 +…. + kCk = 2 ^ k.
Beləliklə, ümumi zaman mürəkkəbliyi O (2 ^ k) olacaqdır.

Kosmik Mürəkkəblik 

Tamam): Verilən sətrin bütün dəyərlərini bir siyahıda saxlamaq üçün O (k) boşluğuna ehtiyacımız var. Həm də ən pis halda rekursiyamıza rekursiv zəng üçün O (k) yığın boşluğu lazımdır. Buradan O (k) + O (k) = ~ O (k).

Yanaşma 2 (Dinamik proqramlaşdırma)

Yuxarıdakı rekursiyada Num (i, j) funksiyasını eyni (i, j) üçün dəfələrlə çağırdığımızı görə bilərik.

Yəni nə edə bilərik ki, hər bir (i, j) üçün ans-ləri yadda saxlaya bilərik ki, bu funksiyanı yenidən çağırmağa ehtiyac olduqda, yaddaşdakı cavabı yenidən hesablamadan birbaşa qaytarırıq. Beləliklə çox vaxta qənaət edir.
Cavabları dinamik olaraq saxlamaq üçün istifadə edə bilərik hash xəritəsi burada sətir indeksi ilə sütun indeksinin birləşməsi olacaq.

Burada görə biləcəyimiz daha bir şey cari satırın dəyərlərini tapmaq üçün yalnız əvvəlki sıra dəyərlərinə ehtiyacımızdır. Bu səbəbdən bir dəfəyə yalnız bir sətir dəyərini saxlaya və növbəti sətrin dəyərlərini tapmaq üçün istifadə edə bilərik. Beləliklə, kosmik mürəkkəbliyi O (k) -ya endirə bilərik.

Məkan optimallaşdırılmış alqoritm:
1. Müvafiq olaraq əvvəlki sətir və cari sətir üçün iki sıra yaradın.
2. Başlanğıc prev sıra {1}.
3. I = 1-dən i = -ə qədər sıra üçün döngə aparınsıra indeksi. Və əvvəlki sətirdən yeni sətir dəyərləri yaradın və saxlayın qarağat serial.
4. İndi yeniləyin prev təyin etməklə sıra ürək sıra prev satır və eyni prosesi bu döngədə təkrarlayın.
5. Saxlanılan son sətri qaytarın prev serial.

Paskalın Üçbucağı II Leetcode Həlli üçün tətbiqetmə

Yaddaşdan istifadə edərək C ++ proqramı

#include <bits/stdc++.h>
using namespace std;

unordered_map<string,int> cache;

int nCr(int n,int r)
{
    string key= to_string(n)+to_string(r);
    if(cache.count(key)) return cache[key]; 

    if(n==0 || r==0 || r==n)
        return 1;

    return ( cache[key]= nCr(n-1,r-1)+ nCr(n-1,r) );
}


vector<int> getRow(int rowIndex) 
{
    vector<int> res(rowIndex+1);

    for(int i=0;i<=rowIndex;i++)
        res[i]= nCr(rowIndex,i);

    return res;

}

int main() 
{
    int rowIndex=3;
    vector<int> ans= getRow(rowIndex);
    for(auto val:ans) cout<<val<<" ";
    
    cout<<endl;
    return 0; 
}

C ++ proqramı (yer optimallaşdırılmış DP)

#include <bits/stdc++.h>
using namespace std;

vector<int> getRow(int rowIndex) 
{
    vector<int> prev={1},curr;
    for(int i=1;i<=rowIndex;i++)
    {
        curr.clear();
        curr.resize(i+1,1);

        for(int j=1;j<i;j++)
            curr[j]=prev[j]+prev[j-1];

        prev=curr;
    }

    return prev;
}

int main() 
{
    int rowIndex=3;
    vector<int> ans= getRow(rowIndex);
    for(auto val:ans) cout<<val<<" ";
    
    cout<<endl;
    return 0; 
}
1 3 3 1

Memoization istifadə edərək Java proqramı

import java.util.*;

class Rextester{
    
    static Map<String,Integer> cache=new HashMap<String,Integer>();
    
    static int nCr(int n,int r)
    {
        String key= "" + n + r;
        if(cache.containsKey(key)) return cache.get(key); 
        
        if(n==0 || r==0 || r==n)
            return 1;
        
        int ans= nCr(n-1,r-1)+ nCr(n-1,r);
        cache.put(key,ans);
        return ans;
    }

    public static List<Integer> getRow(int rowIndex) 
    {
       List<Integer> res=new ArrayList<Integer>();
        for(int i=0;i<=rowIndex;i++)
            res.add(nCr(rowIndex,i));

        return res;
    }

  public static void main(String args[])
    {
       	int rowIndex=3;
        List<Integer> ans= getRow(rowIndex);
        for(int val:ans)  System.out.print(val+" ");
    }
}

Java Proqramı (Space optimize DP)

#include <bits/stdc++.h>
using namespace std;

vector<int> getRow(int rowIndex) 
{
    vector<int> prev={1},curr;
    for(int i=1;i<=rowIndex;i++)
    {
        curr.clear();
        curr.resize(i+1,1);

        for(int j=1;j<i;j++)
            curr[j]=prev[j]+prev[j-1];

        prev=curr;
    }

    return prev;
}

int main() 
{
    int rowIndex=3;
    vector<int> ans= getRow(rowIndex);
    for(auto val:ans) cout<<val<<" ";
    
    cout<<endl;
    return 0; 
}
1 3 3 1

Paskalın Üçbucağı II Leetcode Həlli üçün Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

O (k ^ 2):  Yadda saxlama, müəyyən bir elementin yalnız bir dəfə hesablandığına əmin olardı. Ans xəritəsindən ans xəritəsini götürmək üçün daimi vaxt tələb olunduğunu düşünsək, paskal üçbucağının hər bir dəyərini hesablamaq üçün daimi vaxt tələb olunur.
İndi 1 + 2 + 3 +… + (k + 1) = (k + 1) (k + 2) / 2 dəyərlərini = ~ O (k ^ 2) olan hesablayırıq.

Kosmik Mürəkkəblik 

1. Sadə yaddaşı ən pis vəziyyətdə 1 + 2 + 3 +… + (k + 1) = (k + 1) (k + 2) / 2 elementlərinin hamısını tutacaqdı. Bu tələb edəcək O (k ^ 2) sahəsi.
2. Məkanda optimallaşdırılmış DP-yə ehtiyacımız var Tamam) yalnız son yaradılan sətri saxlamaq üçün yer.

Yanaşma 3 (Riyaziyyat)

Bildiyimiz kimi paskalın üçbucağındakı hər bir dəyər binomial əmsildir (nCr). Və nCr yaza bilərik:
Paskalın Üçbucağı II Leetcode Həlli

İndi görsək, ardıcıl binom katsayıları nC (r-1) və nCr aşağıdakı kimi fərqlənir:
Paskalın Üçbucağı II Leetcode Həlli

Beləliklə, Paskalın üçbucağında ardıcıl olaraq növbəti dövrü əvvəlki müddətdən əldə edə bilərik.

Alqoritm:

  1. Sıranın birinci müddətini 1 olaraq başlayın.
  2. İndeksli sütun üçün bir döngə aparın və növbəti dövrü (müddət (i)) hesablayın, müddət (i) = müddət (i-1) * (n-i + 1) / i.
  3. Hesablanmış dəyərləri bir siyahı kimi qaytarın.

Paskalın Üçbucağı II Leetcode Həlli üçün tətbiqetmə

C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;

vector<int> getRow(int rowIndex) 
{
    int n=rowIndex;
   vector<int> res;
   res.push_back(1);

    for(int i=1;i<=n;i++)
    {
       int x= (int) ( ((long long)res.back()*(n-i+1) ) /i);
       res.push_back(x);
    }

    return res;
}

int main() 
{
    int rowIndex=3;
    vector<int> ans= getRow(rowIndex);
    for(auto val:ans) cout<<val<<" ";
    
    cout<<endl;
    return 0; 
}
1 3 3 1

Java Proqramı

import java.util.*;

class Rextester{

    public static List<Integer> getRow(int rowIndex) 
    {
       int n=rowIndex;
       List<Integer> res=new ArrayList<Integer>();
       res.add(1);
        
        for(int i=1;i<=n;i++)
        {
           int x= (int) ( ((long)res.get(res.size()-1)*(n-i+1) ) /i);
           res.add(x);
        }
        
        return res;
    }

  public static void main(String args[])
    {
       	int rowIndex=3;
        List<Integer> ans= getRow(rowIndex);
        for(int val:ans)  System.out.print(val+" ");
    }
}
1 3 3 1

Paskalın Üçbucağı II Leetcode Həlli üçün Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

Tamam): Sətrin hər dəyəri sabit vaxtda hesablanır.

Kosmik Mürəkkəblik 

Tamam): Çıxışı tutmaqdan başqa əlavə yer tələb olunmur.

Crack Sistemi Dizayn Müsahibələri
Translate »
1