力扣321.拼接最大数
题目

题目解析及思路
题目要求将两个数组的数拼成一个长度为k的最大新数字,要求数字顺序不变
-
分成两个子问题 —— 求数组去除s个数的最大数
- 再归并求最大
- lexicographical_compare(begin1,end1,begin2,end2) 根据字典序比较两数组(字符串)大小
- 从第一个字符开始比较,只要有一个字符不同就结束比较
代码
class Solution {
public:
vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {
vector<int> res(k,0);
int n = nums1.size() , m = nums2.size();
for(int s=max(0,k-m);s<=min(k,n);s++)
{
vector<int> temp;
int i = 0, j =0;
vector<int> temp1 = makMax(nums1,s);
vector<int> temp2 = makMax(nums2,k - s);
auto iter1 = temp1.begin() , iter2 = temp2.begin();
while(iter1 != temp1.end() || iter2 != temp2.end())
temp.push_back(lexicographical_compare(iter1, temp1.end(), iter2, temp2.end()) ? *iter2++ : *iter1++);
res = lexicographical_compare(res.begin(), res.end(), temp.begin(), temp.end()) ? temp : res;
}
return res;
}
//把v数组变成k个数的最大
vector<int> makMax(vector<int> v, int k){
int n = v.size();
if (n <= k)
return v;
vector<int> res;
int pop = n-k;
for (int i=0; i<n; i++){
while(!res.empty() && v[i]>res.back() && pop-->0)
res.pop_back();
res.push_back(v[i]);
}
res.resize(k);
return res;
}
};
1万+

被折叠的 条评论
为什么被折叠?



