Sobes.tech
Middle — Senior

Kuidas deklareerida ja hoida maksimumi akna liigutamisel?

sobes.tech AI

Vastus AI-lt

Selleks, et hoida maksimaalset väärtust aknas, kui aken liigub, kasutatakse sageli andmestruktuuri: kahemastilist järjekorda (deque). Mõte on salvestada elementide indeksid väärtuste kahanevas järjekorras, nii et:

  • Uue elemendi lisamisel eemaldatakse lõpuosast kõik väiksemad elemendid, kuna need ei saa olla maksimum.
  • Akna liigutamisel eemaldatakse algusest elemendid, mis on akna piiridest välja läinud.

See võimaldab saada praeguse akna maksimumi O(1) ajal ning kogu massiivi töödelda O(n) ajal.

Python näide:

from collections import deque

def max_sliding_window(nums, k):
    dq = deque()  # salvestab indeksid
    tulemus = []
    i = 0
    for i, num in enumerate(nums):
        while dq and nums[dq[-1]] < num:
            dq.pop()
        dq.append(i)
        if dq[0] == i - k:
            dq.popleft()
        if i >= k - 1:
            tulemus.append(nums[dq[0]])
    return tulemus

# Näide kasutamiseks
print(max_sliding_window([1,3,-1,-3,5,3,6,7], 3))  # [3,3,5,5,6,7]