1. 程式人生 > >Largest Number組合最大數演算法詳解

Largest Number組合最大數演算法詳解

題目是給出一個非負整數陣列,將他們組合成最大的整數。題目描述如下:
      Given a list of non negative integers, arrange them such that they form the largest number.For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

Note:

      The result may be very large, so you need to return a string instead of an integer.

解題思路:

      由於題目中所給陣列均為非負整數,所以可以直接將其轉換為字串並將其依照相鄰兩個字串拼接按照逆字典序進行排序拼接並直到所有相鄰的字串都滿足拼接的最大要求,那麼這個字串形成的陣列整個拼接起來就是所求的最大整數(字串形式)。然而還要考慮一個特例就是有若干個0的陣列組成的最大數為0,而不是00或者00…00。整個演算法複雜度主要集中在排序那裡,複雜度為O(n2)。具體演算法如下:

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        vector<string
>
arr; for(auto i:nums) arr.push_back(to_string(i)); //將非負整數陣列轉換成字串壓進字串陣列 sort(begin(arr), end(arr), [](string &s1, string &s2){return s1+s2>s2+s1; }); //將字串陣列排序使得能組成最大數 string ans; for(auto s:arr) //將最大數組合出來 ans+=s; while(ans[0
]=='0' && ans.length()>1) //防止出現“00”這樣的結果 ans.erase(0,1); return ans; } };

其提交執行結果如下:
Largest Number