給定長度分別為 m 和 n 的兩個陣列,其元素由 0-9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k (k <= m + n) 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。總的思路為遍歷所有從nums1裡挑出i個數與nums2裡挑出k-i個數的組合方案並取最大值求滿足該條件的最大數。結果返回乙個表示該最大數的長度為 k 的陣列。
說明: 請盡可能地優化你演算法的時間和空間複雜度。
示例 1:
輸入: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]
子問題從nums裡挑數需滿足相對順序不變的最大數
子問題合併兩個陣列也需滿足兩個陣列元素的相對順序不變的最大數
class solution(object):
def maxnumber(self, nums1, nums2, k):
""":type nums1: list[int]
:type nums2: list[int]
:type k: int
:rtype: list[int]
"""def pick(nums, k): # 從nums裡取出相對順序不變的k個數構成的最大數
if not k:
return
res, _pop = , len(nums)-k # _pop為允許pop的個數
while nums:
num = nums.pop(0)
while _pop and res and res[-1] < num:
_pop -= 1
res.pop()
return res[:k]
def merge(nums1, nums2): # 將nums1和nums2各自元素的相對順序不變合併能產生的最大數
res =
while nums1 and nums2:
res.extend(nums1 or nums2)
return res
_max =
for i in range(k+1): # 遍歷所有組合方式,取最大的結果
if i <= len(nums1) and k-i <= len(nums2):
_max = max(_max, merge(pick(nums1[:], i), pick(nums2[:], k-i)))
return _max
LeetCode321 拼接最大數
給定長度分別為 m 和 n 的兩個陣列,其元素由 0 9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k k m n 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長度為 k 的陣列。說明 請盡可能地優化...
leetcode 321 拼接最大數
目錄 一 題目內容 二 解題思路 三 給定長度分別為 m 和 n 的兩個陣列,其元素由 0 9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k k m n 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長...
Leetcode 321 拼接最大數
給定長度分別為 m 和 n 的兩個陣列,其元素由 0 9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k k m n 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長度為 k 的陣列。說明 請盡可能地優化...