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

2021-10-08 23:58:09 字數 1704 閱讀 6329

輸入乙個非負整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。

解題思路:

1. 特殊的排序演算法,x + 「」 +y < y+ "" +x時, x < y;

2. 排序演算法有很多種,挑一種使用;

氣泡排序法:

1. 兩輪迴圈

2. 第一輪迴圈:控制迴圈次數,每次實現乙個資料的正確擺放,有length個資料

2. 第二輪迴圈:前後比較,將最大值往後移動,尋找最大值

/**

* @param nums

* @return

*/var minnumber = function(nums)

for(let i =0;i< nums.length;i++);}}

return nums.join("");

};

選擇排序:

1. 兩輪迴圈

2. 第一輪迴圈: 從前到後,每次實現乙個位置的正確擺放,第0小的,第1小的,第2小的。。。

3. 第二輪迴圈:從剩下資料中,找到最小值的index,然後換到指定位置

/**

* @param nums

* @return

*/var minnumber = function(nums) nums

* @return

*/var minnumber = function(nums)

for(let i =0;i< nums.length;i++)

nums[j] = temp;

break;};}

}return nums.join("");

};

優化後的插入排序:只需要兩輪迴圈,每次插入時,都和前面比較,如果比前面小,替換,繼續往前,前後比較; 如果比前面大,那麼已經找到準確位置;

/**

* @param nums

* @return

*/var minnumber = function(nums)

for(let i =0;i=1;j--)else}}

return nums.join("");

};

快速排序

1. 任意選中乙個支點(選最後乙個點比較好處理),用快慢指標的方式,將比支點小的資料往前放。一輪迴圈後,慢指標指定的位置即為比支點大和比支點小的分隔點,將支點換到這個位置。 對其左右的資料,繼續進行快排

2. 遞迴來實現

/**

* @param nums

* @return

*/var minnumber = function(nums)

const quicksort = (startindex, endindex) =>

}const temp = nums[slowindex];

nums[slowindex] = nums[middleindex];

nums[middleindex] = temp;

quicksort(startindex, slowindex-1);

quicksort(slowindex+1, endindex)

}quicksort(0, nums.length-1);

return nums.join("");

};

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