LINTCODE——创建最大数
思路:把这个问题分成两个子问题:
首先,求在数组中nums取k个数所能组成的最大数;
然后,把两个数组,nums1,nums2合并所能组成的最大数;
前提都是数字相对位置不变;
PS:C++若已知nums1,nums2,则两个数组的大小可以直接用”>”等运算符来判断,这个和字符串一样,要是不想写两个数组比较的代码,可以直接用运算符;
class Solution {
public:
/*
* @param nums1: an integer array of length m with digits 0-9
* @param nums2: an integer array of length n with digits 0-9
* @param k: an integer and k <= m + n
* @return: an integer array
*/
vector<int> maxNumber(vector<int> &nums1, vector<int> &nums2, int k) {
// write your code here
int n1 = nums1.size(), n2 = nums2.size();
vector<int> ans(k,0);
for(int i = max(k-n2, 0); i <=min(k,n1); i++)
{
vector<int> tempans;
tempans = maxArray( maxArray(nums1,i), maxArray(nums2,k-i));
ans = Bigger(ans, tempans)? ans:tempans;
}
return ans;
}
vector<int> maxArray(vector<int> &nums, int k)
{
//drop为在数组中最多能除去多少个数
//计算从数组中取k个数所能够组成的最大数
int drop = nums.size()-k;
vector<int> out;
for(auto x : nums)
{
while(drop>0 && !out.empty() && out.back() < x)
{
drop--;
out.pop_back();
}
out.push_back(x);
}
out.resize(k);
return out;
}
vector<int> maxArray(vector<int> nums1, vector<int> nums2)
{
//计算两个数组合并所能组成的最大数
int n1 = nums1.size(), n2 = nums2.size();
vector<int> out;
int cnt = n1+n2;
while(cnt--)
{
vector<int>& now = nums1 > nums2? nums1:nums2;
out.push_back(now[0]);
now.erase(now.begin());
}
return out;
}
bool Bigger(vector<int> &nums1, vector<int> &nums2)
{
auto start1 = nums1.begin(), end1 = nums1.end();
auto start2 = nums2.begin(), end2 = nums2.end();
while(start1 != end1 && start2!= end2 && *start1 == *start2)
start1++, start2++;
if(start1 == end1 || *start1 < *start2)
return false;
else
return true;
}
};