28拼接最大数(321)

作者: Turbo时间限制: 1S章节: 贪心

晚于: 2020-07-22 12:00:00后提交分数乘系数50%

截止日期: 2020-07-29 12:00:00

问题描述 :

给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。

求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。

说明: 请尽可能地优化你算法的时间和空间复杂度。

示例 1:

输入:

nums1 = [3, 4, 6, 5]

nums2 = [9, 1, 2, 5, 8, 3]

k = 5

输出:

[9, 8, 6, 5, 3]

示例 2:

输入:

nums1 = [6, 7]

nums2 = [6, 0, 4]

k = 5

输出:

[6, 7, 6, 0, 4]

示例 3:

输入:

nums1 = [3, 9]

nums2 = [8, 9]

k = 3

输出:

[9, 8, 9]

可使用以下main函数:

int main()

{

    int m,n,k,data;

    vector<int> nums1,nums2;

    cin>>m;

    for(int i=0; i<m; i++)

    {

        cin>>data;

        nums1.push_back(data);

    }

    cin>>n;

    for(int i=0; i<n; i++)

    {

        cin>>data;

        nums2.push_back(data);

    }

    cin>>k;

    vector<int> res=Solution().maxNumber(nums1,nums2,k);

    for(int i=0; i<res.size(); i++)

        cout<<res[i];

    return 0;

}

输入说明 :

首先输入数组长度m,然后输入m个0-9的数字,各数字以空格分隔。

然后输入数组长度n,然后输入n个0-9的数字,各数字以空格分隔。

最后输入整数k。

输出说明 :

输出结果数组,输出内容无空格。

输入范例 :

输出范例 :

#include <iostream> 
#include <vector>
using namespace std;
class Solution {
public:
    vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k)
    {
        vector<int> ans(k, 0);
        int n = nums1.size();
        int m = nums2.size();
        // 假设有最大子序列中有t个元素来自nums1,对所有可能的t值遍历
        for(int t=max(0,k-m);t<=min(k,n);t++)
        {
            vector<int> temp;
            vector<int> temp_num1=maxxulie(nums1, t);//num1中长为t的最大子序列 
            vector<int> temp_num2=maxxulie(nums2, k-t);//num2中长为k-t的最大子序列 
            auto iter1=temp_num1.begin();
            auto iter2=temp_num2.begin();
            while(iter1!=temp_num1.end()||iter2!=temp_num2.end())
            {
                // lexicographical_compare:比较两个序列的字典序大小
                temp.push_back(lexicographical_compare(iter1,temp_num1.end(),iter2,temp_num2.end())?*iter2++:*iter1++);
            }
            // 如果归并后的最大子序列大于目前已找到的最大子序列,则更新解
            ans=lexicographical_compare(ans.begin(),ans.end(),temp.begin(),temp.end())?temp:ans;
        }
        return ans;
    }
private:    // 求数组vc的长度为n的最大子序列
    vector<int> maxxulie(vector<int> vc,int n)
    {
        int len=vc.size();
        if(len<=n)
            return vc;
        vector<int> res;
        int out=len-n;
        for(int i=0;i<len;i++)
        {
            while(!res.empty()&&out&&vc[i]>res.back())
            {
                res.pop_back();
                out--;
            }
            res.push_back(vc[i]);
        }
        res.resize(n);//调整容器的长度大小,使其能容纳n个元素如果n小于容器的当前的size,则删除多出来的元素。否则,添加采用值初始化的元素。
        return res;
    }
};
int main()
{
    int m,n,k,data;
    vector<int> nums1,nums2;
    cin>>m;
    for(int i=0; i<m; i++)
    {
        cin>>data;
        nums1.push_back(data);
    }
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>data;
        nums2.push_back(data);
    }
    cin>>k;
    vector<int> res=Solution().maxNumber(nums1,nums2,k);
    for(int i=0; i<res.size(); i++)
        cout<<res[i];

    return 0;
}
原文地址:https://www.cnblogs.com/zmmm/p/13623708.html