将数组重新排序以构造最小值

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;
    }
};
posted @ 2017-06-10 23:21  mioopoi  阅读(155)  评论(0编辑  收藏  举报