Middle — Senior
Ինչպես հայտարարել և պահել առավելագույնը պատուհանի տեղափոխման ժամանակ?
sobes.tech AI
Պատասխան AI-ից
Որպեսզի պահել առավելագույնը պատուհանում՝ պատուհանը շարժելիս, հաճախ օգտագործվում է տվյալների կառուցվածք՝ երկկողմանի հերթ (deque): Իդեան այն է, որ պահել տարրերի ցուցանիշները նվազող արժեքների կարգով, որպեսզի՝
- Նոր տարր ավելացնելիս, վերջից հեռացվեն բոլոր փոքր տարրերը, քանի որ նրանք չեն կարող լինել առավելագույնը:
- Պատուհանը շարժելիս, սկզբից հեռացվեն այն տարրերը, որոնք դուրս են եկել պատուհանի սահմաններից:
Այս կերպ հնարավոր է ստանալ ընթացիկ պատուհանի առավելագույնը O(1) ժամանակում, և ամբողջ զանգվածը մշակել O(n) ժամանակում:
Python օրինակով:
from collections import deque
def max_sliding_window(nums, k):
dq = deque() # պահում է ցուցանիշները
արդյունք = []
համար i, num in enumerate(nums):
մինչեւ dq եւ nums[dq[-1]] < num:
dq.pop()
dq.append(i)
եթե dq[0] == i - k:
dq.popleft()
եթե i >= k - 1:
արդյունք.append(nums[dq[0]])
վերադարձնել արդյունք
# Օգտագործման օրինակ
print(max_sliding_window([1,3,-1,-3,5,3,6,7], 3)) # [3,3,5,5,6,7]