Leetcode 321. Create Maximum Number[hard]

题目:
Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum number of length k <= m + n from digits of the two. The relative order of the digits from the same array must be preserved. Return an array of the k digits. You should try to optimize your time and space complexity.

Example 1:
nums1 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
return [9, 8, 6, 5, 3]

Example 2:
nums1 = [6, 7]
nums2 = [6, 0, 4]
k = 5
return [6, 7, 6, 0, 4]

Example 3:
nums1 = [3, 9]
nums2 = [8, 9]
k = 3
return [9, 8, 9]

Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.


这题我用的是暴力的方法。
枚举每个每个数组贡献的数字个数lena和lenb,然后分别找出这两个数组长度为lena和lenb的最大序列,再将这两个最大序列合并,选出所有合并结果中的最大值即为最终答案。
其中,对于一个数组,找出指定长度的最大序列,使用的是栈结构,尽量将较大的数字前移。
总的时间复杂度为O(n^3)。

这里写图片描述

class Solution {
public:
    int max1, max2;
    int pos1, pos2;
    vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {
        vector<int> ans, v1, v2, v3;
        int p = 0, q = 0;
        int num1 = nums1.size();
        int num2 = nums2.size();
        for (int i = max(0, k - num2); i <= min(num1, k); i++) {
            v1 = getmax(nums1, i);
            v2 = getmax(nums2, k - i);
            v3 = getans(v1, v2);
            if (ans.size() == 0 || cmpstr(v3, ans) > 0) ans = v3;
        }
        return ans;
    }

    vector<int> getmax(vector<int>& a, int len) {
        int lena = a.size();
        int p = 0;
        vector<int> ans;
        for (int i = 0; i < lena; i++) {
            ans.push_back(a[i]);
            p++;
            while (p >= 2 && ans[p - 1] > ans[p - 2] && ans.size() + lena - i - 1 > len) {
                ans[p - 2] = ans[p - 1];
                p--;
                ans.pop_back();
            }
        }
        while(ans.size() != len) ans.pop_back();
        return ans;
    }

    vector<int> getans(vector<int>& a, vector<int>& b) {
        vector<int> ans;
        int p = 0, q = 0;
        int sum = a.size() + b.size();
        while (ans.size() < sum) {
            if (p < a.size() && q < b.size()) {
                if (cmpstr(a, b, p, q) > 0) {
                    ans.push_back(a[p]);
                    p++;
                }
                else {
                    ans.push_back(b[q]);
                    q++;
                }
            }
            else if (p < a.size()) {
                ans.push_back(a[p]);
                p++;
            }
            else if (q < b.size()) {
                ans.push_back(b[q]);
                q++;
            }
        }
        return ans;
    }

    int cmpstr(vector<int>& nums1, vector<int>& nums2, int p = 0, int q = 0) {
        while (p < nums1.size() && q < nums2.size()) {
            if (nums1[p] > nums2[q]) return 1;
            else if (nums1[p] < nums2[q]) return -1;
            else p++, q++;
        }
        if (nums1.size() - p >= nums2.size() - q) return 1;
        else return -1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值