LeetCode 321.拼接最大数

class Solution {
public:

    vector<int> GetMonStack(vector<int> &nums,int length){
        stack<int> s;
        int n=nums.size();
        int drop_num=n-length;
        for(int i=0;i<n;++i){
            while(!s.empty() && s.top()<nums[i] && drop_num>0){
                s.pop();
                --drop_num;
            }
            if(s.size()<length)s.push(nums[i]);
            else --drop_num;
        }
        return [](stack<int> ss){vector<int> res(ss.size(),0);int i=ss.size()-1;while(!ss.empty()){res[i--]=ss.top();ss.pop();}return res;}(s);
    }
    //合并两个vector
    vector<int> MergeVector(vector<int> &one,vector<int> &two){
        int size_one=one.size(),size_two=two.size();
        if(!size_one) return two;
        if(!size_two) return one;
        int a=0,b=0;
        int n=size_one+size_two,i=0;
        vector<int> res(size_one+size_two,0);
        while(i<n){
            if(compare(one,a,two,b)>0) res[i++]=one[a++];
            else res[i++]=two[b++];
        }
        return res;
    }
    //比较函数
    int compare(vector<int>& one, int index1, vector<int>& two, int index2) {
        int x = one.size(), y = two.size();
        while (index1 < x && index2 < y) {
            int tag = one[index1++] - two[index2++];
            if (tag != 0) return tag;
        }
        return (x - index1) - (y - index2);
    }
    vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {
        int size_num1=nums1.size(),size_num2=nums2.size();
        int start=max(0,k-size_num2),end=min(size_num1,k);
        vector<int> res(k,0);
        for(int i=start;i<=end;i++){
            vector<int> one(GetMonStack(nums1,i));
            vector<int> two(GetMonStack(nums2,k-i));
            vector<int> temp(MergeVector(one,two));
            if(compare(temp,0,res,0)>0) res.swap(temp);
        }
        return res;
    }
};

求单调栈,这题用单调栈可以做,length是选择的数个数,总能选到最大的组合,因为前导不满足的会被丢弃,知道drop_num等于0时就停止丢弃,这是确保元素个数的保证

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值