The algorithm is quite difficult, you need to think step by step to come up with the idea. I learned the algorithm here.
class Solution {
public:
vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {
vector<int> res;
int size1=nums1.size();
int size2=nums2.size();
for(int i=max(0,k-size2);i<=k&&i<=size1;i++)
{
vector<int> temp=merge(maxArray(nums1,i),maxArray(nums2,k-i),k);
if(greater(temp,0,res,0))
res=temp;
}
return res;
}
vector<int> maxArray(vector<int>& num,int k)
{
vector<int> res;
for(int i=0;i<num.size();i++)
{
while(num.size()-i+res.size()>k&&!res.empty()&&num[i]>res.back())
res.pop_back();
if(res.size()<k)
res.push_back(num[i]);
}
return res;
}
vector<int> merge(vector<int> nums1,vector<int> nums2,int k)
{
vector<int> res;
int i=0,j=0;
while(res.size()<k)
res.push_back(greater(nums1,i,nums2,j)?nums1[i++]:nums2[j++]);
return res;
}
bool greater(vector<int>& nums1,int i,vector<int>& nums2,int j)
{
while(i<nums1.size()&&j<nums2.size()&&nums1[i]==nums2[j])
{
i++;
j++;
}
return j==nums2.size()||(i<nums1.size()&&nums1[i]>nums2[j]);
}
};