zoukankan      html  css  js  c++  java
  • 321 Create Maximum Number 拼接最大数

    已知长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,直观地表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。
    求满足该条件的最大数。结果返回一个表示该最大数的长度为k的数组。
    尽可能优化你的算法的时间和空间复杂度。
    例 1:
    nums1 = [3, 4, 6, 5]
    nums2 = [9, 1, 2, 5, 8, 3]
    k = 5
    返回 [9, 8, 6, 5, 3]
    例 2:
    nums1 = [6, 7]
    nums2 = [6, 0, 4]
    k = 5
    返回 [6, 7, 6, 0, 4]
    例 3:
    nums1 = [3, 9]
    nums2 = [8, 9]
    k = 3
    返回 [9, 8, 9]

    详见:https://leetcode.com/problems/create-maximum-number/description/

    C++:

    class Solution {
    public:
        vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k)
        {
            int m = nums1.size();
            int n = nums2.size();
            vector<int> result(k);
            for (int i = std::max(0 , k - n); i <= k && i <= m; ++i)
            {
                auto v1 = maxArray(nums1, i);
                auto v2 = maxArray(nums2, k - i);
                vector<int> candidate = merge(v1, v2, k);
                if (greater(candidate, 0, result, 0))
                {
                    result = candidate;
                }
            }
            return result;
        }
        bool greater(vector<int>& nums1, int i, vector<int>& nums2, int j)
        {
            while (i < nums1.size() && j < nums2.size() && nums1[i] == nums2[j])
            {
                i++;
                j++;
            }
            return j == nums2.size() || (i<nums1.size() && nums1[i] > nums2[j]);
        }
    
        vector<int> merge(vector<int>& nums1, vector<int>& nums2, int k) 
        {
            std::vector<int> ans(k);
            int i = 0, j = 0;
            for (int r = 0; r<k; r++){
                if( greater(nums1, i, nums2, j) ) 
                {
                    ans[r] = nums1[i++] ;
                }
                else
                {
                    ans[r] = nums2[j++];
                }
            }
            return ans;
        }
        vector<int> maxArray(vector<int>& nums, int k)
        {
            int n = nums.size();
            vector<int> result(k);
            for (int i = 0, j = 0; i < n; i++)
            {
                while (n - i + j>k && j > 0 && result[j-1] < nums[i])
                {
                    j--;
                }
                if (j < k) 
                {
                    result[j++] = nums[i];
                }
            }
            return result;
        }
    };
    

     参考:https://www.cnblogs.com/CarryPotMan/p/5384172.html

  • 相关阅读:
    December 23rd 2016 Week 52nd Friday
    December 22nd 2016 Week 52nd Thursday
    December 21st 2016 Week 52nd Wednesday
    December 20th 2016 Week 52nd Tuesday
    December 19th 2016 Week 52nd Sunday
    December 18th 2016 Week 52nd Sunday
    uva294(唯一分解定理)
    uva11624Fire!(bfs)
    fzu2150Fire Game(双起点bfs)
    poj3276Face The Right Way
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8832370.html
Copyright © 2011-2022 走看看