from typing import List class Solution: def maxNumber(self, nums1: List[int], nums2: List[int], k: int) -> List[int]: def pick(arr: List[int], t: int) -> List[int]: drop = len(arr) - t st = [] for x in arr: while drop and st and st[-1] < x: st.pop() drop -= 1 st.append(x) return st[:t] def greater(a: List[int], i: int, b: List[int], j: int) -> bool: while i < len(a) and j < len(b) and a[i] == b[j]: i += 1 j += 1 if j == len(b): return True if i < len(a) and a[i] > b[j]: return True return False def merge(a: List[int], b: List[int]) -> List[int]: i = j = 0 res = [] while i < len(a) or j < len(b): if greater(a, i, b, j): res.append(a[i]) i += 1 else: res.append(b[j]) j += 1 return res m, n = len(nums1), len(nums2) ans = [] for i in range(max(0, k - n), min(k, m) + 1): a = pick(nums1, i) b = pick(nums2, k - i) cand = merge(a, b) if not ans or cand > ans: ans = cand return ans