给定一组非负整数 nums,重新排列它们每位数字的顺序使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2] 输出:“210” 示例 2:
输入:nums = [3,30,34,5,9] 输出:“9534330” 示例 3:
输入:nums = [1] 输出:“1” 示例 4:
输入:nums = [10] 输出:“10”
提示:
1 <= nums.length <= 100 0 <= nums[i] <= 109
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/largest-number 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路:数组中的每个数都有优先级。定义一种新的优先级,优先级高的数a和优先级低的数b组合时,a-b大于b-a。(-表示组合,如1和23组合为123)
排序本质上是优先级的排序,类比于常规的由大到小的排序,优先级高被定义为数的大小。那么重新定义优先级,应该也能够得到优先级从高到低的排序。c++定义优先级通过cmp函数就可以实现。
排完序之后呢,得到了一个新的序列。这个序列的第一个元素是优先级最高的元素,它和后面的任何元素组合时,一定是它在前面时数最大。这个序列是不是就是最大的整数呢?用反证法,我们假设不是,那么“正确”的序列中的某一个元素c就不能保证比后面元素的优先级高。如果元素d的优先级比c高并且还在后面,那么(c - *** - d )-** < ( d - **-c- ***),与答案矛盾。
class Solution { public: static bool cmp(const string& a, const string& b) { string s1 = a + b; string s2 = b + a; return s1 > s2; } string largestNumber(vector<int>& nums) { vector<string> vs(nums.size()); for (int i = 0; i < nums.size(); i ++) { stringstream ss; ss << nums[i]; ss >> vs[i]; } sort(vs.begin(), vs.end(), cmp); string res; for (int i = 0; i < nums.size(); i ++) { res += vs[i]; } if (res[0] == '0') return "0"; return res; } };