leetcode 321. 拼接最大数(单调栈,分治,贪心)
阅读原文时间:2023年07月09日阅读:1
题目链接

https://leetcode-cn.com/problems/create-maximum-number/

思路:

心都写碎了….

也许就是不适合吧….

你是个好人…

class Solution {
public:
    //单个子序列的情况  -> 单调栈的思想可以处理
    //多个序列的情况,分类讨论,比如第一个序列s 个值,那么必然第二个序列只有k-s个值
    vector<int> solve(vector<int> nums,int k){//保留单个序列的k个值
        int n=nums.size();
        if(k>=n) return nums;
        int left=n-k;
        vector<int> ans;
        for(int i=0;i<nums.size();i++){
            while(ans.size() && nums[i]>ans.back() && left){//这里必须严格大于
                ans.pop_back();
                left--;
            }
            ans.push_back(nums[i]);
        }

        while(left && ans.size()) {
            ans.pop_back();
            left--;
        }

        return ans;
    }

    vector<int> merge(vector<int> nums1,vector<int> nums2) {//合并两个有序列表,不对,这两个列表不能保证是有序的
        int n=nums1.size(),m=nums2.size();
        int i=0,j=0,k=0;
        vector<int> ans=vector<int>(n+m,0);
        for(int k=0;k<n+m;k++){
            ans[k]=max_(nums1,i,nums2,j)?nums1[i++]:nums2[j++];
        }

        return ans;
    }

    // bool max_(vector<int> tmp,vector<int> tmp2){//tmp > tmp2
    //     int n=tmp.size();
    //     for(int i=0;i<n;i++){
    //         if(tmp[i]>tmp2[i]) return true;
    //         else if(tmp[i]<tmp2[i]) return false;
    //     }
    //     return false;
    // }
    bool max_(vector<int> tmp,int i,vector<int> tmp2,int j){//判断tmp >= tmp2 例如:"7" >"67"
        int n1=tmp.size(),n2=tmp2.size();
        while(i<n1 && j<n2 && tmp[i]==tmp2[j]) {i++;j++;}

        return j==n2 || (i<n1 && tmp[i]>tmp2[j]);
    }
    vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {
        int n=nums1.size();
        int m=nums2.size();//
        if(!k) return {};

        vector<int> ans=vector<int>(k,0);
        if(n==0 && m==0) return ans;

        if(n>m) return maxNumber(nums2,nums1,k);

        for(int s=max(0,k-m);s<=k && (s<=n);s++){//这里必须从k-m开始

            vector<int> res=solve(nums1,s);
            vector<int> res2=solve(nums2,k-s);
            // for(auto nxt: res2) printf("%d ",nxt);
            // printf("\n");

            // cout<<"111\n";

            vector<int> res3=merge(res,res2);
            // for(auto nxt: res3) printf("%d ",nxt);
            // printf("\n");

            if(res3.size()==k && max_(res3,0,ans,0)) ans=res3;

            // for(auto nxt: ans) printf("%d ",nxt);
            // printf("\n");
        }

        return ans;
    }
};