Növbəti böyük element#11456

Növbəti böyük element (Həll təhlili)

Tam ədədlərdən ibarət bir stek təyin edək ki, gələcək böyük elementlər haqqında məlumatı saxlamaq üçün istifadə ediləcək. Massiv -nin ədədlərini ardıcıl olaraq — sağdan sola doğru işləyəcəyik. indeksli elementi işləyərkən:

Hər an stek ədədləri azalan ardıcıllıqla saxlayır. Növbəti ədəd gəldikdə, stekdən ondan böyük olmayan bütün elementlər silinir, sonra bu ədəd stekin üstünə yerləşdirilir.

Nümunə

Nümunədəki ədədlərin işlənməsini nəzərdən keçirək.

Alqoritmin reallaşması

Giriş məlumatlarını oxuyuruq.

scanf("%d", &n);
m.resize(n);
for (i = 0; i < n; i++)
  scanf("%d", &m[i]);

Ədədləri ardıcıl olaraq sağdan sola işləyirik.

for (i = n - 1; i >= 0; i--)
{

Stekin üstündən -dən kiçik və ya ona bərabər olan bütün ədədləri silirik.

  while (!s.empty() && (s.top() <= m[i])) s.pop();

-dən sonrakı böyük element stekin üstündə olacaq. Əgər stek boşdursa, nəticə massivinə əlavə edirik.

  if (s.empty()) res.push_back(-1);
  else res.push_back(s.top());

ədədini stekə daxil edirik.

  s.push(m[i]);
}

Nəticə massivini əks etdiririk və çap edirik.

reverse(res.begin(), res.end());
for (i = 0; i < n; i++)
  printf("%d ", res[i]);
printf("\n");

Python reallaşması

Giriş məlumatlarını oxuyuruq.

n = int(input())
m = list(map(int, input().split()))

Siyahıları temp olaraq təyin edirik.

res = []
s = []

Ədədləri ardıcıl olaraq sağdan sola işləyirik.

for i in range(n - 1, -1, -1):

Stekin üstündən -dən kiçik və ya ona bərabər olan bütün ədədləri silirik.

  while s and s[-1] <= m[i]:
    s.pop()

-dən sonrakı böyük element stekin üstündə olacaq. Əgər stek boşdursa, nəticə siyahısına əlavə edirik.

  if not s:
    res.append(-1)
  else:
    res.append(s[-1])

ədədini stekə daxil edirik.

  s.append(m[i])

Nəticə siyahısını əks etdiririk və çap edirik.

res.reverse()
print(*res)