[动态规划] leetcode 321 Create Maximum Number

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;
    }
};

猜你喜欢

转载自www.cnblogs.com/fish1996/p/11332299.html
今日推荐