LeetCode筆記 179 最大數

2021-10-19 13:15:33 字數 2604 閱讀 5076

179. 最大數

劍指 offer 45. 把陣列排成最小的數

給定一組非負整數 nums,重新排列它們每個數字的順序(每個數字不可拆分)使之組成乙個最大的整數。

注意:輸出結果可能非常大,所以你需要返回乙個字串而不是整數。

示例 1:

輸入:nums = [10,2]

輸出:「210」

示例 2:

輸入:nums = [3,30,34,5,9]

輸出:「9534330」

示例 3:

輸入:nums = [1]

輸出:「1」

示例 4:

輸入:nums = [10]

輸出:「10」

1 <= nums.length <= 100

0 <= nums[i] <= 109

剛一開始這個題我是不會做的,只能靠看看別人的題解勉強過日子,就這個樣子。

我能看懂的也就是呼叫arrays.sort函式並且自定義比較函式介面以及使用快排自定義排序

這裡我們就用一下快排,下面的圖是演算法導論上的快排模板

}我們想一想,怎麼排這個陣列,才能讓它的結果是最大的呢?

[3,30,34,5,9]

首先是直觀上來說,我們一定要把9放在第一位,5放在第二位,這是毋庸置疑的。比如我們有乙個陣列[1, 2, 3, 4, 5, 6, 7, 8, 9],要你你怎麼排?自然是排成[9, 8, 7, 6, 5, 4, 3, 2, 1]

所以我們先排一下,[9, 5, 3, 30, 34],那麼問題又出現了,3、30、34之間應該怎麼排序呢?

所以3、30、34應該排成34330這種形式。

那麼我們如何確定5應該放在這些3開頭的數字之前呢?也是一樣的,5與任何3開頭的數字組合在一起,一定是5開頭的最大。比如534放在一起,一定是534>345

這樣排序規則就很清晰了,只要xy(組合成字串)大於yx,那麼x就應該放在y前面。

所以整個快排模板幾乎不用動,我們只需要改變partition裡面的比較規則即可:

for

(int i = index; i <= right; i++

)}

我們設array[i]的字串為x,array[pivot]的字串為y,

如果xy > yx,則將x放在左邊,這一次遍歷後效果應該是類似於下圖

只是個類似,數量都不對應。

只要知道了怎麼排,知道了比較的條件,寫快排應該還是很容易的。

leetcode筆記 179最大數

題目 給定一組非負整數,重新排列它們的順序使之組成乙個最大的整數。示例 1 輸入 10,2 輸出 210示例 2 輸入 3,30,34,5,9 輸出 9534330說明 輸出結果可能非常大,所以你需要返回乙個字串而不是整數。本題的思路是首先將整數陣列轉化為字串陣列,然後使用comparator介面,...

leetcode 179 題 最大數

leetcode 179 題 題目 最大數 題目描述 給定一組非負整數,重新排列它們的順序使之組成乙個最大的整數。示例 1 輸入 10,2 輸出 210 示例 2 輸入 3,30,34,5,9 輸出 9534330 說明 輸出結果可能非常大,所以你需要返回乙個字串而不是整數。解決思路 arrays....

leetcode題 179 最大數(中等)

一 題目描述 179.最大數 中等 給定一組非負整數,重新排列它們的順序使之組成乙個最大的整數。示例 1 輸入 10,2 輸出 210 示例 2 輸入 3,30,34,5,9 輸出 9534330 說明 輸出結果可能非常大,所以你需要返回乙個字串而不是整數。二 解題思路 對陣列進行排序,排序的比較函...