classSolution { public: voidperm(int pos, vector<int> &num, string &ret){ if (pos + 1 == num.size()) { // 一次全排列的结果 string tmp = ""; for (int val : num) { tmp += to_string(val); } ret = min(ret, tmp); return; } for (int i = pos; i < num.size(); ++i) { swap(num[pos], num[i]); perm(pos+1, num, ret); swap(num[pos], num[i]); } } stringPrintMinNumber(vector<int> nums){ stringret(nums.size(), '9'); // nums.size()个'9' perm(0, nums, ret); return ret; } };
2. 解题思路:贪心,排序剪枝
显然方法一出现了太多无关的排列,我们需要一个最小的数,细想一下可知,如果有两个字符串a,b,如果a + b < b + a, 显然我们希望a排在b的前面,因为a排在前面可以使结果更小。于是我们就自定义排序规则,使得 numbers 中字符串都满足如上规则,那么,最后的字符串数组中字符串拼接的数字肯定是最小的。
算法步骤:
numbers 转化为 numbers ;
自定义上述排序规则;
整合结果
Complexity
时间复杂度:O(NlogN), 采用了排序
空间复杂度:O(N)
Code
1 2 3 4 5 6 7 8 9
# -*- coding:utf-8 -*- classSolution: defPrintMinNumber(self, numbers): # write code here ifnot numbers: return'' numbers = list(map(str,numbers)) numbers.sort(cmp=lambda x,y:cmp(x + y, y + x)) return''.join(numbers).lstrip('0') or'0'