题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组[3, 32, 321],则打印出这3个数字能排成的最小数字321323。
样例
输入:[3, 32, 321]
输出:321323
算法
(比较器)
- 因为输出要是string格式,所以要在将nums的元素放入str的时候,使用
to_string()
函数 - 因为是vector,所以排序是
sort(a.begin(), a.end())
。 cmp
想要放在里面,一定要加static
关键字。同时返回类型是bool
,我一开始写成了void。
时间复杂度
$O(n!)$
因为是方案是种类是组合数的方式,所以方案数就是n的阶乘。
C++ 代码
class Solution {
public:
static bool cmp(string a, string b) // **1 **2
{
return a + b < b + a;
}
string printMinNumber(vector<int>& nums) {
vector<string> str;
for(auto x : nums) str.push_back(to_string(x)); // **3
sort(str.begin(), str.end(), cmp); // **4
string res = "";
for(auto s : str) res += s;
return res;
}
};
时间复杂度是O(nlog n),这里并没有枚举,与O(n!)无关
为什么cmp比较函数前必须写static呢?
sort 中的比较函数只能是静态函数或全局函数,这是在类里,所以是静态函数。放到类外面可以把 static 去掉
请问 sort(str.begin(), str.end(), cmp); 这一句的时间复杂度是多少?
sort()
是排序函数,所以是$O(nlogn)$。但是不如$O(n!)$大,所以总的时间复杂度还是$O(n!)$。
多谢,我是c++初学者,觉得这个sort很神奇啊hh
sort()
的实现很复杂,应该是插入排序+快速排序
一起实现的。默认是从小到大排序,
如果想从大到小,可以这样
sort(a.begin(), a.end(), greater<int>())
。这种是不是等价
sort(a.rbegin(), a.rend(), cmp)
。不是
to_string(x) 在这里是什么意思呢
为什么bool cmp 里面 可以定义 a+b<b+a
string 加减运算不是根据字典序排序的么
to_string()
将int型转换成string。因为
cmp
中的参数都是string,所以a + b是”3” + “32”这种,结果就是”332”或者”323”。好的!!!多谢啦!