将数组重新排序以构造最小值
http://www.lintcode.com/zh-cn/problem/reorder-array-to-construct-the-minimum-number/
暴力枚举是肯定不可行的,那样复杂度太高(阶乘级)。仔细想想,最优解中两个数字m和n是什么样?一定是mn拼接和nm拼接较小的那个所对应的顺序(如果不是这样的话,我们总能将m和n交换从而得到更好的组合),其他两两组合同理,于是解决这个问题只要定义排序规则就可以了,只不过这里是对字符串的排序。
另外,注意容易出错的case:
case 1: 0 (输出0)
case 2: 0 2 (输出2)
因此最后要注意前导0的去除。
bool cmp(const string& x, const string& y) {
return (x+y < y+x);
}
class Solution {
public:
/**
* @param nums n non-negative integer array
* @return a string
*/
string minNumber(vector<int>& nums) {
if (nums.empty()) {
return "";
}
vector<string> nums_str(nums.size());
for (int i = 0; i < nums.size(); ++i) {
nums_str[i] = to_string(nums[i]);
}
sort(nums_str.begin(), nums_str.end(), cmp);
string ret;
int i = 0;
while (i < nums_str.size() && nums_str[i] == "0") {
i++;
}
while (i < nums_str.size()) {
ret += nums_str[i++];
}
if (ret.empty()) {
ret = "0";
}
return ret;
}
};