321. Create Maximum Number

·

1 min read

Problem Link

class Solution:
    def maxNumber(self, nums1: List[int], nums2: List[int], k: int) -> List[int]:
        res = []
        lower = max(0, k - len(nums2)) # pick all elements from nums2
        upper = min(k, len(nums1)) # pick all elements from nums1
        for i in range(lower, upper + 1):
            res = max(res, self.merge(self.maxOne(nums1, i), self.maxOne(nums2, k - i)))
        return res

    def maxOne(self, nums, k) -> List[int]:
        numCanPop = len(nums) - k
        res = []
        for n in nums:
            while len(res) > 0 and res[-1] < n and numCanPop > 0:
                res.pop()
                numCanPop -= 1
            res.append(n)
        return res[:k]

    def merge(self, nums1, nums2) -> List[int]:
        res = []
        p1 = 0
        p2 = 0
        while p1 < len(nums1) or p2 < len(nums2):
            if nums1[p1:] > nums2[p2:]:
                res.append(nums1[p1])
                p1 += 1
            else:
                res.append(nums2[p2])
                p2 += 1
        return res