- 最大数给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 示例 1:输入:nums = [10,2]
输出:"210"示例 2:输入:nums = [3,30,34,5,9]
输出:"9534330"示例 3:输入:nums = [1]
输出:"1"示例 4:输入:nums = [10]
输出:“10”
解题思路:优先队列+自定义排序,时间复杂度On,空间复杂度On
1.转换成字符串格式;
2.自定义排序;
3.遍历,插入优先队列中,优先队列中的排序就是按自定义的排序规则排序的;
4.以此将优先队列头部元素连接到答案中,弹出优先队列;
5.最终得到答案;
class Solution {
public:
string largestNumber(vector<int>& nums) {
//vector<string> ans;
priority_queue<string,vector<string>,cmp> ans;
string my_ans;
for(int i = 0 ;i<nums.size();i++)
{
ans.push(std::to_string(nums[i])); //
}
if(nums.size() == 1)return ans.top();
for(int i = 0;i<nums.size();i++)
{
my_ans += ans.top();
ans.pop();
}
if(my_ans[0]=='0')my_ans = "0";
return my_ans;
}
struct cmp{
bool operator ()(string &a,string &b)
{
return a+b<b+a;
}
};
};
//2021.4.12 这道题关键在于自定义排序
小记:1.整数 to 字符串 :用标准库自带的to_string()实现;
2.字符串 to 整数 :用stdlib库中的atoi()函数,atoi(str.c_str());C++中要有c_str()转换 一下格式;
3.自定义排序:返回语句中,如果是用了<(大根堆,从大到小),如果返回为true那么排序就是:a<b,如果是false,是:a>b。大的一方在前面(队列中的排序)
如果是>(小根堆,从小到大),如果返回为true那么排序就是:a<b,如果是false,是:a>b。小的一方在前面(队列中)
比如:
struct cmp{
bool operator ()(string &a,string &b)
{
return a+b<b+a;
}
};
};
a | b |
---|---|
7 | 78 |
7 | 73 |
上面两个例子 :“7”+“78”<“78”+“7” 返回值为true ,所以意味着:b>a
“7”+“73”<“73”+“7”,返回值为false,所以意味着:a>b;。符合我们期望的自定义排序规则;