leetcode 321 拼接最大數

2021-10-11 02:42:21 字數 3259 閱讀 5192

目錄

一、題目內容

二、解題思路

三、**

給定長度分別為 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]

題目太難,總之就是遍歷所有的組合k=i+j,然後融合兩個陣列,比較每次res的大小,得到最大的。

class solution1:

def maxnumber(self, nums1: list, nums2: list, k: int) -> list:

m = len(nums1)

n = len(nums2)

res = [0 for _ in range(k)]

for i in range(max(0, k - n), k + 1):

if i <= m:

arr = self.merge(nums1=self.maxlist(nums1, i),

nums2=self.maxlist(nums2, k - i),

k=k)

if self.compare_same_location_num(arr, 0, res, 0):

res = arr

return res

def maxlist(self, nums, k):

n = len(nums)

res = [0 for _ in range(k)]

j = 0

for i in range(n):

while n - i + j > k and j > 0 and nums[i] > res[j - 1]:

j -= 1

if j < k:

res[j] = nums[i]

j += 1

return res

def merge(self, nums1, nums2, k):

res = [0 for _ in range(k)]

i, j = 0, 0

for r in range(k):

if self.compare_same_location_num(nums1, i, nums2, j):

res[r] = nums1[i]

i += 1

else:

res[r] = nums2[j]

j += 1

return res

def compare_same_location_num(self, nums1, i, nums2, j):

while i < len(nums1) and j < len(nums2) and nums1[i] == nums2[j]:

i += 1

j += 1

return j == len(nums2) or (i < len(nums1) and nums1[i] > nums2[j])

class solution2:

def maxnumber(self, nums1: list, nums2: list, k: int) -> list:

# 求出單個陣列可以組成i位的最大陣列

def getmaxarr(nums, i):

if not i:

return

# pop表示最多可以不要nums裡幾個數字,要不組成不了i位數字

stack, pop = , len(nums) - i

for num in nums:

while pop and stack and stack[-1] < num:

pop -= 1

stack.pop()

return stack[:i]

def merge(tmp1, tmp2):

return [max(tmp1, tmp2).pop(0) for _ in range(k)]

res = [0] * k

for i in range(k + 1):

if i <= len(nums1) and k - i <= len(nums2):

# 取num1的i位, num2的k - i

tmp1 = getmaxarr(nums1, i)

tmp2 = getmaxarr(nums2, k - i)

# 合併

tmp = merge(tmp1, tmp2)

if res < tmp:

res = tmp

return res

if __name__ == '__main__':

nums1 = [3, 4, 6, 5]

nums2 = [9, 1, 2, 5, 8, 3]

k = 5

s1 = solution1()

ans1 = s1.maxnumber(nums1, nums2, k)

print(ans1)

s2 = solution2()

ans2 = s2.maxnumber(nums1, nums2, k)

print(ans2)

LeetCode321 拼接最大數

給定長度分別為 m 和 n 的兩個陣列,其元素由 0 9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k k m n 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長度為 k 的陣列。說明 請盡可能地優化...

leetcode321 拼接最大數

給定長度分別為 m 和 n 的兩個陣列,其元素由 0 9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k k m n 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長度為 k 的陣列。說明 請盡可能地優化...

Leetcode 321 拼接最大數

給定長度分別為 m 和 n 的兩個陣列,其元素由 0 9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k k m n 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長度為 k 的陣列。說明 請盡可能地優化...