劍指offer32 - 把數組排成最小的數(c++)

題目描述:輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字爲321323。

題解:可以用全排列的做法找到最小的數,但是這樣就會使得最後得結果要在n!個數中進行比較,這樣比較的次數和最後的結果個數太多,所有我們可以用下面的辦法,只需要在sort()函數中自定義一個Compare,讓按照Compare的規則將比較後的數進行排列,得到的就是最小值。
全排列代碼鏈接: https://blog.csdn.net/ADream__/article/details/105145908

class Solution {
public:
    static bool Compare(int a,int b){
        string strNum1=to_string(a);//數字轉字符串
        string strNum2=to_string(b);
        return (strNum1+strNum2)<(strNum2+strNum1);
    }
    string PrintMinNumber(vector<int> numbers) {
        string str;
        if(numbers.empty())
            return str;
        sort(numbers.begin(),numbers.end(),Compare);//排序規則
        for(int i = 0; i < numbers.size();i++)
            str += to_string(numbers[i]);
        return str;
    }
};

關於sort的第三個參數的定義: 強烈推薦看技術文檔
可以看到Compare的定義:Compare函數返回一個bool類型的值,這個值表示了在嚴格弱排序中(可以理解爲升序排序)第一參數是否位於第二個參數之前。

也就是說如果comp返回true,則第一個參數小於第二個參數,sort根據compare的返回值將第一個參數排在第二個參數之前。
如果comp返回false,則第一個參數大於第二個參數,sort根據compare的返回值將第一個參數排在第二個參數之後。

傳入A,B,定義bool myfunction (int i,int j) { return (i<j); },作爲comp函數,則排列AB。
傳入BA,則排列AB。
可以看出是升序排列的。(sort函數默認的comp函數也是默認升序的)

而如果我們定義bool myfunction (int i,int j) { return (i>j); },作爲comp函數,
傳入AB,返回false,則排列爲BA,
傳入BA,返回true,排列爲BA。
是降序排列的。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章