-
题目:
把一个vector,使其每个元素值接起来得到的值最小;
考虑大数,需要用string保存结果; -
思路:
1.指定一个排序规则:时间O(nlogn),最坏O(n^2);空间O(logn),最坏O(n)
//写法1:
class Solution {
public:
string minNumber(vector<int>& nums) {
string res;
if (nums.empty()) return res;
auto lamb = [](int a, int b)->bool {
auto as = to_string(a), bs = to_string(b);
return as + bs < bs + as;
};
sort(nums.begin(), nums.end(), lamb);//这里需要转一次
for (auto x : nums) res+= to_string(x);//这里也需要转一次
return res;
}
};
//写法2:为了避免多次将int转乘string的操作,因此开头把vector<int>转成vector<string>,虽浪费了空间,但节省了时间,每个int只需转一次string即可;
class Solution {
public:
string minNumber(vector<int>& nums) {
string res;
if (nums.empty()) return res;
vector<string> vs;
for (auto x : nums) vs.push_back(to_string(x));
sort(vs.begin(), vs.end(), [](string& a, string& b){ return a + b < b + a; });
for (auto x : vs) res+= x;
return res;
}
};
2.手写快排:O(nlogn),O(1)
把str1 + str2 < str2 + str1的排序规则应用在快排上;
class Solution {
public:
void quickSort(vector<string>& strs, int left, int right) {
if (left >= right) return;
int l = left;
int r = right;
string pivot = strs[left];
while (l < r) {
while (l < r && strs[r] + pivot >= pivot + strs[r]) r--; //右哨兵找小的
while (l < r && strs[l] + pivot <= pivot + strs[l]) l++; //左哨兵找大的
if (l < r) swap(strs[l], strs[r]);
}
swap(strs[l], strs[left]);
quickSort(strs, left, l - 1);
quickSort(strs, l + 1, right);
}
string minNumber(vector<int>& nums) {
vector<string> strs;
for (int num : nums) strs.push_back(to_string(num));
quickSort(strs, 0, strs.size() - 1);
string ans;
for (string str : strs) ans += str;
return ans;
}
};
- 总结:
关于排序的帖子lc大佬