Problem Statement
(Source) Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum number of length k <= m + n from digits of the two. The relative order of the digits from the same array must be preserved. Return an array of the k digits. You should try to optimize your time and space complexity.
Example 1: nums1 = [3, 4, 6, 5] nums2 = [9, 1, 2, 5, 8, 3] k = 5 return [9, 8, 6, 5, 3] Example 2: nums1 = [6, 7] nums2 = [6, 0, 4] k = 5 return [6, 7, 6, 0, 4] Example 3: nums1 = [3, 9] nums2 = [8, 9] k = 3 return [9, 8, 9]
Analysis
Solve two simpler problems first:
(1) Create the maximum number from only one array.
(2) Create the maximum number from both arrays using all their elements.
Tags: Greedy
.
Solution
from collections import deque
class Solution(object):
def maxNumber(self, nums1, nums2, k):
"""
:type nums1: List[int]
:type nums2: List[int]
:type k: int
:rtype: List[int]
"""
res = []
for i in xrange(max(0, k - len(nums2)), min(k, len(nums1)) + 1):
res = max(res, self.merge(self.maxNum(nums1, i), self.maxNum(nums2, k - i)))
return res
def maxNum(self, nums, k):
"""Get the maximum number that can be obtained from one array.
"""
sta = deque()
n = len(nums)
for i in xrange(n):
while sta and sta[-1] < nums[i] and len(sta) + n - i - 1 >= k:
sta.pop()
if len(sta) < k:
sta.append(nums[i])
return list(sta)
def merge(self, nums1, nums2):
"""Merge two arrays into one.
"""
m, n = len(nums1), len(nums2)
res = [max(nums1, nums2).pop(0) for _ in xrange(m + n)]
return res