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