fork download
  1. from collections import namedtuple
  2. from numbers import Number
  3. from statistics import median_low
  4. from typing import Iterable
  5.  
  6. Element = namedtuple("Element", ["height", "index"])
  7.  
  8. def max_ht_diff(heights: Iterable[Number]) -> Iterable[tuple[Element, Element]]:
  9. elts = [Element(h, i) for i, h in enumerate(heights)]
  10. if len(elts) % 2 != 0:
  11. raise NotImplementedError
  12. middle = median_low(elts)
  13.  
  14. stack = []
  15. while elts:
  16. if not stack:
  17. stack.append(elts.pop())
  18. if (stack[-1] <= middle) != (elts[-1] <= middle):
  19. yield stack.pop(), elts.pop()
  20. else:
  21. stack.append(elts.pop())
  22.  
  23.  
  24. hts = [3, 1, 4, 5, 9, 2, 7, 5]
  25. for a, b in max_ht_diff(hts):
  26. print(f"pair {a} with {b}")
Success #stdin #stdout 0.27s 18600KB
stdin
Standard input is empty
stdout
pair Element(height=7, index=6) with Element(height=2, index=5)
pair Element(height=5, index=3) with Element(height=4, index=2)
pair Element(height=9, index=4) with Element(height=1, index=1)
pair Element(height=5, index=7) with Element(height=3, index=0)