leetcode321 拼接最大數

2021-10-01 02:37:04 字數 1511 閱讀 1369

給定長度分別為 m 和 n 的兩個陣列,其元素由 0-9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k (k <= m + n) 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。

求滿足該條件的最大數。結果返回乙個表示該最大數的長度為 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]

總的思路為遍歷所有從nums1裡挑出i個數與nums2裡挑出k-i個數的組合方案並取最大值

子問題從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 的陣列。說明 請盡可能地優化...