Given two arrays of length m
and n
with digits 0-9
representing two numbers. Create the maximum number of length k <= m + n
from digits of the two. The relative order of the digits from the same array must be preserved. Return an array of the k
digits. You should try to optimize your time and space complexity.
Example 1:
nums1 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
return [9, 8, 6, 5, 3]
Example 2:
nums1 = [6, 7]
nums2 = [6, 0, 4]
k = 5
return [6, 7, 6, 0, 4]
Example 3:
nums1 = [3, 9]
nums2 = [8, 9]
k = 3
return [9, 8, 9]
代码:
class Solution
{
public:
vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k)
{
int n=nums1.size();
int m=nums2.size();
vector<int>ans;
for(int i=max(0,k-m); i<=min(k,n); i++)
ans=max(ans,mergeV(maxx(nums1,i),maxx(nums2,k-i)));
return ans;
}
vector<int>maxx(vector<int>nums,int k)
{
int ll=nums.size()-k;
vector<int>ans;
for(int i=0; i<nums.size(); i++)
{
while(ll&&ans.size()&&ans.back()<nums[i])
{
ans.pop_back();
ll--;
}
ans.push_back(nums[i]);
}
ans.resize(k);
return ans;
}
vector<int>mergeV(vector<int>nums1,vector<int >nums2)
{
vector<int>ans;
while(nums1.size()+nums2.size())
{
vector<int>temp;
if(nums1<nums2)
{
temp=nums2;
ans.push_back(nums2[0]);
nums2.erase(nums2.begin());
}
else
{
temp=nums1;
ans.push_back(nums1[0]);
nums1.erase(nums1.begin());
}
}
return ans;
}
};