Növbəti Q sayının daha çox sayını çap edin

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Amazon Məlumat dəsti Fanatics
Geyim QalaqBaxılıb 71

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.

Çap et Daha çox Q sorğusu problemini verdik array nömrələri olan n ölçülü bir [] və sorğuları təmsil edən m ölçülü q [] başqa bir sıra. Hər bir sorğu bir [] massivindəki indeksi təmsil edir. Hər bir sorğu üçün q [i] indeksindəki ədədin yanında olan [[] massivindəki ədədi çap edirəm.

Növbəti Q sayının daha çox sayını çap edinPin

misal

Input 

a [] = {3, 4, 2, 7, 5, 8, 10, 6}

q [] = {3, 6, 1}

Buraxılış

8-1 7

Input 

a [] = {4, 7, 9, 8}

q [] = {1, 2}

Buraxılış

9-1

Sadəlövh metod

Alqoritm

  1. Sorğuları təmsil edən n ölçülü bir [] və m ölçülü bir q [] bir sıra başlayın.
  2. 0-dan m-1-ə keçin və q [i] +1 -dən n-1-ə qədər daxili döngə yaradın. A [] massivinin cari indeksindəki elementin q [i] -ə bərabər indeksdəki elementdən çox olub olmadığını yoxlayın, elementi indiki indeksdə [] massivində çap edin.
  3. Sorğu indeksindəki elementdən sonra massivdə daha böyük bir element qalmırsa -1 çap edin.

Daha çox sayda Q sorğusunu çap etmək üçün C ++ Proqramı

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

void next_greatest(int a[], int n, int q[], int m){ 
    
    for(int i=0; i<m; i++){
        
        for(int j=q[i]+1; j<n; j++){
            
            if(a[j]>a[q[i]]){
                cout<<a[j]<<" ";
                break;
            }
            
            if(j==n-1){
                cout<<"-1 ";
            }
        }
    }
} 

int main(){ 
    int a[] = {3, 4, 2, 7, 5, 8, 10, 6}; 
    int n = sizeof(a) / sizeof(a[0]); 
    
    int q[] = {3, 6, 1}; 
    int m = sizeof(q) / sizeof(q[0]); 
    
    next_greatest(a, n, q, m);
    
    return 0;
}
8 -1 7

Daha çox sayda Q sorğusunu çap etmək üçün Java Proqramı

import java.util.*;

class nextGreatest{
    
    static void next_greatest(int[] a, int n, int[] q, int m){ 
    
        for(int i=0; i<m; i++){
            
            for(int j=q[i]+1; j<n; j++){
                
                if(a[j]>a[q[i]]){
                    System.out.print(a[j]+" ");
                    break;
                }
                
                if(j==n-1){
                    System.out.print("-1 ");
                }
            }
        }
    } 

  public static void main (String[] args){
      
    int[] a = {3, 4, 2, 7, 5, 8, 10, 6}; 
        int n = a.length; 
        
        int[] q = {3, 6, 1}; 
        int m = q.length; 
        
        next_greatest(a, n, q, m);
  }
}
8 -1 7

Mürəkkəblik təhlili

Zamanın mürəkkəbliyi: O (m * n), burada n - a [] massivindəki elementlərin sayı və m - q [] massivindəki elementlərin sayı.

Köməkçi məkan: O (1), çünki daimi əlavə yerdən istifadə edirik.

Səmərəli metod

Alqoritm

  1. Sorğuları təmsil edən n ölçülü bir [] və m ölçülü bir q [] bir sıra başlayın.
  2. Növbəti elementi yığını saxlamaq və içərisinə 0 basmaq üçün növbəti [] bir sıra yaradın.
  3. 1-dən n-1-ə qədər keçin və yığının boş itələmə cari indeksini və ya içindəki i dəyərini yoxlayın.
  4. Yığın boş olmadıqda, indiki indeksdəki bir [] massivindəki elementin yığının yuxarı hissəsindəki elementdən çox və ya ona bərabər olub olmadığını yoxlayın, yeniləmə indeksi indiki kimi dizinin üst hissəsinə bərabərdir [] a cari indeks və yuxarı hissəni açın, əks halda döngəni pozun.
  5. Yığın boş olmadıqda yenə keçin, yeniləmə indeksi bir sıra yığının üstünə bərabərdir [] olaraq -1 və üstü açılır.
  6. 0-dan m-1-ə qədər keçin və elementi [] massivindən q [i] -ə bərabər mövqedə növbəti [] massivində saxlanılan indeksə uyğun olan bir [] yazdırın.

Daha çox sayda Q sorğusunu çap etmək üçün C ++ Proqramı

#include <bits/stdc++.h> 
using namespace std; 
void next_greatest(int next[], int a[], int n){ 
    stack<int> s; 
    s.push(0);  
    for(int i = 1; i < n; i++)
    {   
        while(!s.empty()){   
            int cur = s.top();  
            if(a[cur] < a[i]){                   
                next[cur] = i;   
                s.pop(); 
            }  
            else{
                break;
            }    
        } 
        s.push(i); 
    }  
    while(!s.empty()){ 
        int cur = s.top(); 
        next[cur] = -1; 
        s.pop(); 
    } 
} 
void answer_query(int a[], int next[], int n, int q[], int m){ 
    for(int i=0; i<m; i++){
        int position = next[q[i]]; 
      
        if(position == -1){ 
            cout<<-1<<" "; 
        }    
      
        else{
            cout<<a[position]<<" ";
        }    
    }
} 
  
int main(){ 
  
    int a[] = {3, 4, 2, 7, 5, 8, 10, 6}; 
    int n = sizeof(a) / sizeof(a[0]); 
    
    int q[] = {3, 6, 1};
    int m = sizeof(q) / sizeof(q[0]); 
  
    int next[n] = { 0 }; 
  
    next_greatest(next, a, n); 
  
    answer_query(a, next, n, q, m); 
 
    return 0; 
}
8 -1 7

Daha çox sayda Q sorğusunu çap etmək üçün Java Proqramı

import java.util.*; 

class NextGreatest{ 
    public static int[] next_greatest(int a[], int q[]){ 
        int ans[] = new int[a.length];
        
        Stack<Integer> s = new Stack<>(); 
        s.push(a[0]); 
        int j = 0; 
        for(int i = 1; i < a.length; i++){ 
            int next = a[i]; 
            
            if(!s.isEmpty()){ 
                int element = s.pop(); 
                
                while(next > element){ 
                    ans[j] = next; 
                    j++; 
                    if(s.isEmpty()) 
                        break; 
                    element = s.pop(); 
                } 
                
                if(element > next) 
                    s.push(element); 
            } 
            s.push(next); 
        }
        
        while(!s.isEmpty()){ 
            int element = s.pop(); 
            ans[j] = -1; 
            j++; 
        } 
        
        return ans; 
    } 
    
    public static void main(String[] args){ 
        int a[] = {3, 4, 2, 7, 5, 8, 10, 6}; 
        int q[] = {3, 6, 1}; 
        int ans[] = next_greatest(a,q); 
        
        for(int i = 0; i<q.length; i++){ 
            System.out.print(ans[q[i]] + " "); 
        } 
    } 
}
8 -1 7

Mürəkkəblik təhlili

Zamanın mürəkkəbliyi: max (O (n), O (m)), O (n) sonrakı elementlər üçün massivi əvvəlcədən işləmək üçün və hər bir sorğu daimi vaxt tələb edir, yəni O (1).

Köməkçi məkan: O (n), burada n - a [] massivindəki elementlərin sayı.

References

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