LeetCode #321: Create Maximum Number

来源:互联网 发布:算法导论 pdf下载 编辑:程序博客网 时间:2024/06/06 03:31

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 = 5return [9, 8, 6, 5, 3]Example 2:nums1 = [6, 7]nums2 = [6, 0, 4]k = 5return [6, 7, 6, 0, 4]Example 3:nums1 = [3, 9]nums2 = [8, 9]k = 3return [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 dequeclass 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

References

(1) http://www.cnblogs.com/CarryPotMan/p/5384172.html

1 0
原创粉丝点击