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.git
Note: You should try to optimize your time and space complexity.github
Example 1:算法
Input: nums1 = [3, 4, 6, 5] nums2 = [9, 1, 2, 5, 8, 3] k = 5 Output: [9, 8, 6, 5, 3]
Example 2:数组
Input: nums1 = [6, 7] nums2 = [6, 0, 4] k = 5 Output: [6, 7, 6, 0, 4]
Example 3:app
Input: nums1 = [3, 9] nums2 = [8, 9] k = 3 Output: [9, 8, 9]
给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个天然数各位上的数字。如今从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。优化
求知足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。ui
说明: 请尽量地优化你算法的时间和空间复杂度。spa
示例 1:code
输入: nums1 = [3, 4, 6, 5] nums2 = [9, 1, 2, 5, 8, 3] k = 5 输出: [9, 8, 6, 5, 3]
示例 2:队列
输入: nums1 = [6, 7] nums2 = [6, 0, 4] k = 5 输出: [6, 7, 6, 0, 4]
示例 3:
输入: nums1 = [3, 9] nums2 = [8, 9] k = 3 输出: [9, 8, 9]
# -*- coding: utf-8 -*- # @Author: 何睿 # @Create Date: 2019-02-24 14:35:27 # @Last Modified by: 何睿 # @Last Modified time: 2019-02-26 16:08:04 from collections import deque class Solution: def maxNumber(self, nums1: [int], nums2: [int], k: int) -> [int]: ans = [] for i in range(k + 1): # 若是已经超出了第一个数组的范围,循环结束 if i > len(nums1): break # 若是 k - i 比第二个数组的元素个数更多, # 说明第二个数组不可以提供足够的元素,继续循环 if k - i > len(nums2): continue # 产生新的组合 newans = self._merge(self._Max(nums1, i), self._Max(nums2, k - i)) # 取最大的组合 ans = max(ans, newans) return ans def _Max(self, nums, k): # 须要去掉的个数 drop = len(nums) - k stack = [] # 遍历每个元素 for num in nums: # 若是栈不为空 而且 drop 大于零 而且 num 大于栈顶元素 while stack and drop > 0 and num > stack[-1]: # 弹出栈顶元素 stack.pop() # 须要弹出的元素个数减一 drop -= 1 stack.append(num) # 返回前 k 个元素 return stack[:k] def _merge(self, num1, nums2): # 将列表转换成队列 queue1 = deque(num1) queue2 = deque(nums2) res = [] while queue1 and queue2: # 队列大小的比较 # 对队列每一个元素从前向后比较,只要有一个比较大,则该队列比较大 if queue1 > queue2: res.append(queue1.popleft()) else: res.append(queue2.popleft()) # 添加队列剩下的元素 if queue1: res += queue1 if queue2: res += queue2 return res