動機

沒有魔法的一題

但要怎麼看出沒有魔法?

Problem

You are given two integer arrays nums1 and nums2 of lengths m and n respectively. nums1 and nums2 represent the digits of two numbers. You are also given an integer k.

Create the maximum number of length k <= m + n from digits of the two numbers. The relative order of the digits from the same array must be preserved.

Return an array of the k digits representing the answer.

 

Example 1:

Input: nums1 = [3,4,6,5], nums2 = [9,1,2,5,8,3], k = 5Output: [9,8,6,5,3]

Example 2:

Input: nums1 = [6,7], nums2 = [6,0,4], k = 5Output: [6,7,6,0,4]

Example 3:

Input: nums1 = [3,9], nums2 = [8,9], k = 3Output: [9,8,9]

 

Constraints:

  • m == nums1.length
  • n == nums2.length
  • 1 <= m, n <= 500
  • 0 <= nums1[i], nums2[i] <= 9
  • 1 <= k <= m + n

Sol

如果只是要字典序最大,用monotonic stack就好

接著就是merge,要看字典序大小去merge

最後就是try所有組合

class Solution:
    def maxNumber(self, nums1: List[int], nums2: List[int], k: int) -> List[int]:
        def maxList(ns, drop):
            ret = []
            for n in ns:
                while drop > 0 and ret and ret[-1] < n:
                    ret.pop()
                    drop -= 1
                ret.append(n)
            return ret
        def merge(nums1, nums2):
            ans = []
            while nums1 or nums2:
                if nums1 > nums2:
                    ans += [nums1[0]]
                    nums1 = nums1[1:]
                else:
                    ans += [nums2[0]]
                    nums2 = nums2[1:]
            return ans
        ret = []
        for i in range(k):
            a,b = len(nums1)-i, len(nums2)-(k-i)
            if a >= 0 and b >= 0:
                ret = max(ret, merge(maxList(nums1,a),maxList(nums2,b))[:k])
        return ret