Maks yığın

Çətinlik səviyyəsi Asan
Tez-tez soruşulur alma lyft Über
Layihə QalaqBaxılıb 147

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

"Max stack" problemi, bu əməliyyatları yerinə yetirə biləcək xüsusi bir yığın dizayn etməyi bildirir:

  1. bas (x): bir elementi yığına itələyin.
  2. üst (): yığının üstündəki elementi qaytarır.
  3. pop (): elementi yuxarıdakı yığından çıxarın.
  4. peekmax (): yığının maksimum elementini qaytarır.
  5. popmax (): maksimum elementi yığından çıxarın və geri qaytarın.

Yığımda birdən çox Maksimum element varsa, o zaman üçün popmax () ən üst olan yalnız bir elementi çıxarın.

Son dörd əməliyyat üçün bu, yığının boş olmadığından əmindir, əks halda bu əməliyyatlar çağırılmayacaqdır.

misal

push(5);
push(1);
push(5);
top();
popMax();
top();
peekMax();
pop();
top();
5
5
1
5
1
5

Izahat

Max yığınıPin

Yanaşma

Yanaşma çox sadədir. Burada maksimum elementi izləyəcək maksimum yığını təmin edəcəyik qalaq indiyə qədər. Üç əməliyyata başlamaq normal yığın tərəfindən dəstəkləndiyindən, xüsusilə son iki əməliyyat üçün proqram hazırlamalıyıq.

peekmax ()

Tutaq ki, [5,2,3,6,8] yığınınız var, buna görə başqa bir yığını qoruyacağıq. bu elementə qədər maksimum saxlayacaq maksimum yığın kimi adlandıraq. Beləliklə, verilmiş yığın üçün maksimum yığımız [5,5,5,6,8] olacaqdır. Bu şəkildə maksimum elementi O (1) zaman mürəkkəbliyində tapa bilərik.

popmax ()

Peekmax () istifadə edərək yığında maksimum elementi asanlıqla tapa bilərik. Beləliklə, yığından elementləri açacağıq və bir tampon yığınına itələyəcəyik. Maksimum element tapana qədər bunu təkrarlayacağıq.

Sonra yığından maksimum elementi açacağıq. Bundan sonra tampon yığınındakı bütün elementləri orijinal yığına köçürəcəyik.

Kodu

Max Stack üçün C ++ kodu

class MaxStack {
    public MaxStack() {
         stack<int> tmpStack, maxStack;
    }
    public void push(int x) {
        int max = maxStack.empty() ? x : maxStack.top();
        maxStack.push(max > x ? max : x);
        tmpStack.push(x);
    }
    public int pop() {
        int tmp=tmpStack.top();
        tmpStack.pop();
        maxStack.pop();
        return tmp;
    }
    public int top() {
        return tmpStack.top();
    }
    public int peekMax() {
        return maxStack.top();
    }
    public int popMax() {
        int mx = peekMax();
        stack<int> buffer;
        while (tmpStack.top() != mx){
            buffer.push(tmpStack.top());
            tmpStack.pop();
        }
        while (!buffer.empty()){
            tmpStack.push(buffer.top());
            buffer.pop();
        }
        return mx;
    }
}
push(5);
push(1);
push(5);
top();
popMax();
top();
peekMax();
pop();
top();
5
5
1
5
1
5

Max Stack üçün Java kodu

class MaxStack {
    Stack<Integer> tmpStack;
    Stack<Integer> maxStack;
    public MaxStack() {
        tmpStack = new Stack<Integer>();
        maxStack = new Stack<Integer>();
    }
    public void push(int x) {
        int max = maxStack.isEmpty() ? x : maxStack.peek();
        maxStack.push(max > x ? max : x);
        tmpStack.push(x);
    }
    public int pop() {
        maxStack.pop();
        return tmpStack.pop();
    }
    public int top() {
        return tmpstack.peek();
    }
    public int peekMax() {
        return maxStack.peek();
    }
    public int popMax() {
        int max = peekMax();
        Stack<Integer> buffer = new Stack<Integer>();
        while(tmpStack.top() != mx){
        	buffer.push(tmpStack.top());
        	tmpStack.pop();
        }
        while (!buffer.isEmpty()){
        	tmpStack.push(buffer.top());
        	buffer.pop();
        }
        return mx;
    }
}
push(5);
push(1);
push(5);
top();
popMax();
top();
peekMax();
pop();
top();
5
5
1
5
1
5

Mürəkkəblik təhlili

Zaman mürəkkəbliyi

  1. bas (x): O (1) elementləri bir addımda yığına itələyə bilərik.
  2. pop (): O (1) bir elementi yığından bir addımda ata bilərik.
  3. üst (): O (1) yığının üst elementini tək bir addımla qaytara bilərik.
  4. peekmax (): O (1) yığında maksimum elementi bir addımda tapa bilərik.
  5. popmax (): O (n) ən pis halda, maksimum element yığının alt hissəsində ola bilər.

Kosmik mürəkkəblik

O (n) ən pis halda bütün elementlər eyni anda yığında mövcuddur.

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