您的位置:首页 > 其它

给定只包含正数的数组,给出一个方法,将数组中的数拼接起来,得到的数,是最大的。

2013-07-21 12:33 429 查看
问题:

给定只包含正数的数组,给出一个方法,将数组中的数拼接起来,得到的数,是最大的。如果a[5]={10,110,1110,1,1},则所得的最大数为11111011010.

分析:

首先,我们需要明确的是最后得到的数字,一定是原数组元素的一个排列,比如给定数组为[3, 30, 34, 5, 9],最终所得的最大数字为9534330就可以看成是原数组的一个排列[9, 5, 34, 3, 30]。我们可以通过枚举原数组的所有排列,然后把最大值保存下来,不过这样做的时间复杂度为

,在实际中显然是不可取的,所以我们需要寻找更高效的方法.

我们考查数组a中的任意两个元素,假设其在数组中的下标分别为i和j,那么i和j的位置有两种情况:相邻和不相邻。首先,我们看一下i和j相邻的情况。假设i和j相邻,那么,我们只用比较a[i] + a[j]和a[j] + a[i]的大小就能判断i和j的位置关系(注:此处的+不是数学中传统的加减法,是连接的意思)。由此我们也很容易得出,最终所要求的满足条件的排列,一定存在这样的一个关系:

&space;+&space;a[i&space;+1]>=a[i&space;+&space;1]&space;+&space;a[i](i\epsilon&space;[0,n-2])]



而求解出这个满足条件的排列的过程可以看成是冒泡排序(便于理解),只是比较元素的大小的规则不同。根据此关系,我们可以证明在满足该关系的条件下交换任意两个不相邻的元素,只会导致最终解小于或者等于,故此时的解即为最优解。

bool cmp(const string &a, const string &b)
{
    return a + b > b + a;
}
string largestNumbers(vector<int> &num)
{
    vector<string> rec;
    for (int i = 0; i < num.size(); ++i)
    {
        char tmp[15];
        sprintf(tmp, "%d", num[i]);
        rec.push_back(string(tmp));
    }
    sort(rec.begin(), rec.end(), cmp);
    return accumulate(rec.begin(), rec.end(), string(""));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐