problem:https://leetcode.com/problems/create-maximum-number/
分治。计算第一个数组最大的和第二个数组最大的,然后结合起来找最大的。
class Solution { public: void getMax(vector<int>& nums, vector<int>& res, int n) { int k = nums.size() - n; for(int i = 0;i < nums.size(); i++) { while(k && !res.empty() && nums[i] > res.back()) { res.pop_back(); k--; } res.push_back(nums[i]); } while(k && res.size()) { k--; res.pop_back(); } } bool isLarger(vector<int>& nums1, vector<int>& nums2) { int size = min(nums1.size(), nums2.size()); for(int i = 0;i < size; i++) { if(nums1[i] != nums2[i]) return nums1[i] > nums2[i]; } return false; } void merge(vector<int>& nums1, vector<int>& nums2, vector<int>& res) { int i = 0; int j = 0; int n = nums1.size() + nums2.size(); for(int k = 0;k < n; k++) { if(i == nums1.size()) res.push_back(nums2[j++]); else if(j == nums2.size()) res.push_back(nums1[i++]); else if(nums1[i] == nums2[j]) { int i0 = i; int j0 = j; while(i0 < nums1.size() && j0 < nums2.size() && nums1[i0] == nums2[j0]) { i0++; j0++; } if(i0 < nums1.size() && j0 < nums2.size() && nums1[i0] > nums2[j0]) res.push_back(nums1[i++]); else if(i0 < nums1.size() && j0 < nums2.size() && nums1[i0] < nums2[j0]) res.push_back(nums2[j++]); else if(i0 == nums1.size()) res.push_back(nums2[j++]); else res.push_back(nums1[i++]); } else if(nums1[i] > nums2[j]) res.push_back(nums1[i++]); else res.push_back(nums2[j++]); } } vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int K) { int m = nums1.size(); int n = nums2.size(); vector<int> ans(K, 0); for(int k = 0; k <= K; k++) { int left = k; int right = K - k; if(left <= m && right <= n) { vector<int> res1, res2, res; getMax(nums1, res1, left); getMax(nums2, res2, right); merge(res1, res2, res); if(isLarger(res, ans)) { ans = res; } } } return ans; } };
[动态规划] leetcode 321 Create Maximum Number
原文:https://www.cnblogs.com/fish1996/p/11332299.html