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