题目:
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]
Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.
这题我用的是暴力的方法。
枚举每个每个数组贡献的数字个数lena和lenb,然后分别找出这两个数组长度为lena和lenb的最大序列,再将这两个最大序列合并,选出所有合并结果中的最大值即为最终答案。
其中,对于一个数组,找出指定长度的最大序列,使用的是栈结构,尽量将较大的数字前移。
总的时间复杂度为O(n^3)。
class Solution {
public:
int max1, max2;
int pos1, pos2;
vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {
vector<int> ans, v1, v2, v3;
int p = 0, q = 0;
int num1 = nums1.size();
int num2 = nums2.size();
for (int i = max(0, k - num2); i <= min(num1, k); i++) {
v1 = getmax(nums1, i);
v2 = getmax(nums2, k - i);
v3 = getans(v1, v2);
if (ans.size() == 0 || cmpstr(v3, ans) > 0) ans = v3;
}
return ans;
}
vector<int> getmax(vector<int>& a, int len) {
int lena = a.size();
int p = 0;
vector<int> ans;
for (int i = 0; i < lena; i++) {
ans.push_back(a[i]);
p++;
while (p >= 2 && ans[p - 1] > ans[p - 2] && ans.size() + lena - i - 1 > len) {
ans[p - 2] = ans[p - 1];
p--;
ans.pop_back();
}
}
while(ans.size() != len) ans.pop_back();
return ans;
}
vector<int> getans(vector<int>& a, vector<int>& b) {
vector<int> ans;
int p = 0, q = 0;
int sum = a.size() + b.size();
while (ans.size() < sum) {
if (p < a.size() && q < b.size()) {
if (cmpstr(a, b, p, q) > 0) {
ans.push_back(a[p]);
p++;
}
else {
ans.push_back(b[q]);
q++;
}
}
else if (p < a.size()) {
ans.push_back(a[p]);
p++;
}
else if (q < b.size()) {
ans.push_back(b[q]);
q++;
}
}
return ans;
}
int cmpstr(vector<int>& nums1, vector<int>& nums2, int p = 0, int q = 0) {
while (p < nums1.size() && q < nums2.size()) {
if (nums1[p] > nums2[q]) return 1;
else if (nums1[p] < nums2[q]) return -1;
else p++, q++;
}
if (nums1.size() - p >= nums2.size() - q) return 1;
else return -1;
}
};