①.該題的本質即為從兩個陣列中挑選 k 個元素,並且使拼接後的結果的字典序最大。
②.要使陣列的字典序最大,則需要保證從左到右的每乙個位置的值盡可能的大,即單調遞減。
③.列舉所有 k 的組合情況,分別從兩個陣列中取 i、j 個元素構成的最大陣列,然後再進行合併,最終保留最大值。
④.在挑選指定個數的元素的過程中,若當前供挑選的元素數量大於需要的個數,則進行取捨操作,以使每乙個位置的值盡可能的大。
⑤.合併過程中,分別從頭到尾遍歷兩個陣列並比較當前元素優先取較大值作為合併結果;若當前位置值相等,則需要進行進行下一位的比較,以確保下一位可選的元素值最大。
①.序列的字典序比較:從第一位開始分別比較對應的元素值,若分出大小則返回結果,否則繼續進行下一位的大小。
②.vector 的預設比較操作即為字典序比較。
③.stl 中的 lexicographical_compare() 演算法可以按字典序比較由開始和結束迭代器定義的兩個序列。
①.單調棧:就是棧內元素單調按照遞增(遞減)順序排列的棧。
②.單調棧的實現:可以使用 vector 來實現棧操作,vector 可以在末尾快速的新增和刪除元素,並且方便棧內元素的讀取。
vector<
int> result;
//單調遞減棧
for(
auto
&num : nums)
//遍歷每個元素,進行新增操作
// 當前元素入棧
result.
push_back
(num)
;}
class
solution
}return result;
}//從陣列中取 k 位數字,並保持相對順序,使其構成的數字最大
vector<
int>
getmax
(vector<
int>
& nums1,
int k)
if( result.
size()
< k )
//未取夠k個,新增到末尾
else
//已經取夠了k個,直接丟棄
}return result;
}//合併兩個遞減陣列,使結果儲存遞減,並且構成的數字最大
vector<
int>
meger2vec
(vector<
int>
& nums1,vector<
int>
& nums2)
else
}//拷貝剩餘元素到結果陣列
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 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長...