题目:
https://leetcode.com/problems/create-maximum-number/
思路:
从nuns1中选[0, min(nums1.size(),k] 个数字,剩下的从nuns2选,选出来后按照规则组合成一个数字,最大的为答案。注意边界条件。
class Solution
{
public:
vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k)
{
if (k <= 0)
{
return vector<int>();
}
if (k > nums1.size() + nums2.size())
return merge(nums1, nums2);
int n1 = nums1.size(), n2 = nums2.size();
vector<int> res(k, -1);
for (int i = 0; i <= min(n1, k); ++i)
{
int j = k - i;
if (j > nums2.size())
continue;
vector<int> r1 = getnumber(nums1, i), r2 = getnumber(nums2, j);
vector<int> tmp = merge(r1, r2);
if (tmp > res)
res = tmp;
}
return res;
}
vector<int> merge(vector<int>&r1, vector<int>&r2)
{
int i = 0, j = 0;
vector<int> res;
while (i < r1.size() && j<r2.size())
{
//r1[i] == r2[j]的判断条件十分关键!
if (r1[i] == r2[j])
{
vector<int> tmp1(r1.begin() + i, r1.end()), tmp2(r2.begin() + j, r2.end());
if (tmp1 >= tmp2)
res.push_back(r1[i++]);
else
res.push_back(r2[j++]);
}
else if (r1[i]>r2[j])
{
res.push_back(r1[i]);
++i;
}
else
{
res.push_back(r2[j]);
++j;
}
}
if (i < r1.size())
{
res.insert(res.end(), r1.begin() + i, r1.end());
}
if (j < r2.size())
{
res.insert(res.end(), r2.begin() + j, r2.end());
}
return res;
}
vector<int> getnumber(vector<int>& nums, int k)
{
vector<int> res(k, 0);
int begin = 0, cur = 0;
while (cur != k)
{
int maxindex = begin;
for (int i = begin + 1; i <= nums.size() - k + cur; ++i)
{
if (nums[i] > nums[maxindex])
maxindex = i;
}
res[cur] = nums[maxindex];
begin = maxindex + 1;
++cur;
}
return res;
}
};