Leetcode 321 拼接最大數

2021-10-11 02:58:54 字數 1689 閱讀 5855

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

值得注意的是,題目中提到拼接後的數字需要保持原陣列的相對順序,因此可以使用最大子串行來入手。由於題目要求返回給定長度的序列,而兩個陣列的長度並不是固定的,所以需要通過列舉的方式在限定的長度範圍之內逐一求出該情況的序列,並根據比較得出最大的那乙個。求單個陣列的最大子串行,可以使用單調棧實現;求合併後的序列,可以使用歸併的方式實現

func

maxnumber

(nums1 [

]int

, nums2 [

]int

, k int)[

]int

}return maxsub

}func

max(a, b int

)int

return b

}func

min(a, b int

)int

return a

}// 利用棧獲得指定長度的最大子串行

func

getmaxsub

(nums [

]int

, k int)[

]int

if top < k -

1else

}return stack

}// 將兩個子串行進行歸併,求出最大的子串行

func

merge

(num1, num2 [

]int)[

]int

if y ==

0 totallen := x + y

merged :=

make([

]int

, totallen)

index1, index2 :=0,

0for i :=

0; i < totallen; i++

else

}return merged

}// 比較兩個子串行的大小

func

cmp(num1 [

]int

, index1 int

, num2 [

]int

, index2 int

)int

index1++

index2++

}return x - index1 - y + index2

}

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 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長...