【发布时间】:2021-06-18 05:01:43
【问题描述】:
给定一个数字数组,以产生最大值的方式排列它们。 例如,如果给定数字是 {54, 546, 548, 60},则排列 6054854654 给出最大值。 如果给定的数字是 {1, 34, 3, 98, 9, 76, 45, 4},则排列 998764543431 给出最大值。
所以,提供的函数声明是
string printLargest(vector<string> &arr)
下面提供了我写的解决方案。
string printLargest(vector<string> &arr) {
for (int i=0; i<arr.size()-1; i++) {
for (int j=i+1; j<arr.size(); j++) {
string y = arr[i] + arr.at(j);
string z = arr[j] + arr[i];
if (z>y) swap(arr[j], arr[i]);
}
}
string y="";
for(string x:arr) y +=x;
return y;
}
在线编译器显示“超出时间限制” 请优化您的代码并再次提交。 我认为我的解决方案需要 O(n^2)。 预期时间复杂度:O(NlogN), 如何优化我的代码?
【问题讨论】:
-
使用标准排序算法?例如
std::sort -
从算法上讲,“最高”的数字不会先排序,然后产生最高的数字吗?就像按他们的字符串版本排序,“99”>“989”等。
-
按降序对字符串进行排序,但是您仍然需要蛮力在具有相同前缀的字符串之间进行选择,例如
54,546 -> 54654和54,543 -> 54543您可能会遇到与 next prefix 组合的类似情况。 .. -
你不能在向量大小的唯一棱镜上分析这个问题的算法复杂性。向量物质所包含的整数的大小
标签: c++ arrays string algorithm