最大数
给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。
示例 1:
输入: [10,2]
输出: 210
示例 2:
输入: [3,30,34,5,9]
输出: 9534330
说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
思路:
- 可以创建一个大顶堆,对每个两个数的组合进行排序,大的排前面,自定义比较函数。
- 对大顶堆进行遍历,逐元素拼接到字符串上。
注意:
- 若数组为空,则返回空字符串。
- 数组由一连串0组成,则返回“0”,而非“000…”。
- 不允许将数组元素按位拆开,每个数是一个整体。例如在示例2中,答案为9534330,而不是9543330,因为34是一个整体,不允许拆开。
代码:
//自定义比较函数
struct cmp{
bool operator()(int a, int b)
{
string tmp_a=to_string(a);
string tmp_b=to_string(b);
return stol(tmp_a+tmp_b)>stol(tmp_b+tmp_a)? false:true;
}
};
string largestNumber(vector<int>& nums) {
//注意1
if(nums.size()==0)
return "";
//思路1
priority_queue<int,vector<int>,cmp> big_q;
for(auto& e:nums)
{
big_q.push(e);
}
//注意2
if(big_q.top()==0)
return "0";
//思路2
string res_str;
while(!big_q.empty())
{
int tmp=big_q.top();
big_q.pop();
res_str+=to_string(tmp);
}
return res_str;
}
结果:
参考链接:
[1] PaniniGu:Leetcode 179. 最大数 解题思路及C++实现