劍指offer45 把陣列排成最小的數 C語言

2021-10-09 12:06:32 字數 840 閱讀 7794

//  輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出來的所有數字中最小的乙個。例如,輸入陣列,則列印出來能排列的最小數字是321323.

思路1:最直觀的方法就是求出這個陣列中所有的排列方式,然後依次比較找到最小的那個。但n個數字總共有n!個排列,效率比較低。

思路2:對陣列進行重排。找到乙個排序規則,每次用兩個數進行比較,有兩種方法,第乙個數在前或第乙個數在後,如果第一種情況的排法大於第二種,則進行交換。順序列印最終陣列的元素,即為最小。但要考慮0不能放在第乙個位置。

思路2實現:

bool compare

(int a,

int b)

while

(num2)

num1 = a *

(int

)pow(10

, lenb)

+ b;

num2 = b *

(int

)pow(10

, lena)

+ a;

if(num1 > num2)

return false;

return true;

}void

min(

int*arr,

int len)}}

//直接列印處排好的陣列中的元素

for(

int i =

0; i < len;

++i)

cout << endl;

}

執行結果:

劍指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哪個應...