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

2021-10-08 06:57:44 字數 1381 閱讀 2451

通過題意可知,不管這些數字如何排列,形成的數字位數時不變的。所以如果高位的數字越小,則最終的結果也就越小。下面的n為數字的個數

注意,這裡的排列規則和字串的排列規則有區別,比如,2和20,明顯應該20排在2前面,結果才會更小(202<220),因此我們可以得到最終的排序規則應該是

如果s1+s2bool

cmp(std::string& s1, std::string& s2)

下面**分別給出了cmp函式寫排序規則和lambda寫排序規則兩種形式

1.初始化字串陣列strs,儲存結果的字串ans

2.遍歷初始的整型陣列nums,將其元素加入strs

3.呼叫排序

4.遍歷strs,將其元素相加即為最終結果

由於使用了快排,時間複雜度o(nlogn)

空間負責度o(n)

自定義排序

**1

bool

cmp(std::string& s1, std::string& s2)

class

solution

std::

sort

(strs.

begin()

, strs.

end(

), cmp)

;for

(auto s : strs)

return ans;}}

;

**2
class

solution

std::string minnumber

(std::vector<

int>

& nums)

std::

sort

(strs.

begin()

, strs.

end(

), cmp)

;for

(auto s : strs)

return ans;}}

;

**3

利用lambda表示式寫排序的規則,如果不熟悉lambda,可以採用上述方法即可

//lambda表示式排序

class

solution

//lambda表示式

std::

sort

(strs.

begin()

, strs.

end(),

(std::string& s1, std::string& s2));

for(

int i =

0; i < strs.

size()

; i++

)return ans;}}

;

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

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。思路1 根據全排列,將三個數字的全排列全寫出來,然後比較大小,這種辦法在數比較多時,效率不高。思路2 先比較前兩個數字m和n排列的大小 mn和n...

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

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例 輸入陣列,列印321323。排列出所有的組合,比較出最小的,輸出。時間複雜度 o n 空間複雜度 o n 考察最小組合的形式,遵從下面的規律 1 首位小的靠前 2 首位相同,次位小的靠前 3 位數少的靠前...

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

輸入乙個正整數陣列,把陣列裡所有的數拼接為乙個數,列印出能拼接出的所有數字中最小的乙個。比如輸入 輸出 321323.這道題其實是希望我們能找到乙個排序規則,陣列根據這個排序規則排列後能排成乙個最小的數。要確定排序規則,就要比較兩個數字,也就是給出兩個數字m n,我們需要確定乙個規則判斷m和n哪個應...