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

  • 相关阅读:
    在Centos 7下编译openwrt+njit-client
    开博随笔
    Chapter 6. Statements
    Chapter 4. Arrays and Pointers
    Chapter 3. Library Types
    Chapter 2.  Variables and Basic Types
    关于stm32不常用的中断,如何添加, 比如timer10 timer11等
    keil 报错 expected an identifier
    案例分析 串口的地不要接到电源上 会烧掉
    案例分析 CAN OPEN 调试记录 进度
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8832370.html
Copyright © 2011-2022 走看看