zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Python基础之初始编码
    Excel图表编辑---表格移动,样式修改
    Python基础之Python的变量、常量
    刷题62. Unique Paths
    刷题56. Merge Intervals
    刷题55. Jump Game
    刷题53. Maximum Subarray
    刷题49. Group Anagrams
    刷题48. Rotate Image
    刷题46. Permutations
  • 原文地址:https://www.cnblogs.com/zmmm/p/13623708.html
Copyright © 2011-2022 走看看