Guest User

Untitled

a guest
Oct 23rd, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.08 KB | None | 0 0
  1. from collections import deque, namedtuple
  2.  
  3.  
  4. QItem = namedtuple('QItem', 'index, value')
  5.  
  6.  
  7. class MaxQueue:
  8.     def __init__(self, k):
  9.         self.k = k
  10.         self.xs = deque()
  11.  
  12.     def sanitize(self, i: int):
  13.         """pop the leftmost item if its index is out of reach"""
  14.         if self.xs and self.xs[0].index <= i - self.k:
  15.             self.xs.popleft()
  16.  
  17.     def push(self, qitem: QItem):
  18.         self.sanitize(qitem.index)
  19.         while self.xs and self.xs[-1].value < qitem.value:
  20.             self.xs.pop()
  21.         self.xs.append(qitem)
  22.  
  23.     def max(self):
  24.         return self.xs[0].value
  25.  
  26.  
  27. def max_k_queue(xs, k):
  28.     res = []
  29.     mq = MaxQueue(k)
  30.     for i, x in enumerate(xs):
  31.         mq.push(QItem(i, x))
  32.         if i >= k-1:
  33.             res.append(mq.max())
  34.     return res
  35.  
  36.  
  37. def main():
  38.     _test()
  39.     print("ok")
  40.  
  41.  
  42. def _test():
  43.     assert max_k_queue([10, 5, 2, 7, 8, 7], 3) == [10, 7, 8, 8]
  44.     assert max_k_queue([10, 5, 2, 7, 8, 7], 6) == [10]
  45.     assert max_k_queue([1, 2, 3, 4], 1) == [1, 2, 3, 4]
  46.  
  47.  
  48. if __name__ == '__main__':
  49.     main()
Advertisement
Add Comment
Please, Sign In to add comment