栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode 321. 拼接最大数***

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode 321. 拼接最大数***

具体思路:

涉及以下点:

  1. 如何利用单调栈寻找不连续保持相对位置的前k个值;
  2. 字符串合并问题;
具体代码:
class Solution {
public:
    vector maxNumber(vector& nums1, vector& nums2, int k) {
        int m=nums1.size();
        int n=nums2.size();
        int start=max(0,k-n),end=min(k,m);//即总和为k情况,start能有多少个位置;
        vector cur(k,0);
        for(int i=start;i<=end;i++){
            vector q1=pick(nums1, i);
            vector q2=pick(nums2,k-i);
            vector ret=merage_(q1, q2);
            if(cmp(ret, cur,0,0))
                cur=ret;
        }
        return cur;
    }

    vector pick(vector& vec,int k){
        vector st;
        int index=0;
        int remain=vec.size()-k;//需要剔除多少个元素;
        for(int i=0;i
            while(!st.empty()&&vec[i]>*st.rbegin()&&remain>0){
                remain--;
                st.pop_back();
                index--;
            }
            if(index
                st.push_back(vec[i]);
                index++;
            }else{
                remain--;
            }
        }
        return st;
    }

    vector merage_(vector& a,vector& b){
        vectorret;
        for(int i1=0,i2=0;i1!=a.size()||i2!=b.size();){
            if(i1==a.size()){
                ret.push_back(b[i2++]);
                continue;
            }
            if(i2==b.size()){
                ret.push_back(a[i1++]);
                continue;
            }
            if(a[i1]>b[i2]){
                ret.push_back(a[i1++]);
            }else if(a[i1]
                ret.push_back(b[i2++]);
            }else{
                int que=cmp(a,b,i1,i2);
                if(cmp(a, b, i1, i2)>0){
                    ret.push_back(a[i1++]);
                }else{
                    ret.push_back(b[i2++]);
                }
            }
        }
        return ret;
    }

    bool cmp(vector& a,vector& b,int i1,int i2){
        int m=a.size();
        int n=b.size();
        while(i1
            if(a[i1]==b[i2]){
                i1++,i2++;
                continue;
            }
            if(a[i1]>b[i2])
                return true;
            else
                return false;
        }
        return (m-i1)>(n-i2);
    }
};```

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960331.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号