[LintCode] Create Maximum Number 创建最大数

简介:

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.
Have you met this question in a real interview?
Example
Given nums1 = [3, 4, 6, 5], nums2 = [9, 1, 2, 5, 8, 3], k = 5
return [9, 8, 6, 5, 3]
Given nums1 = [6, 7], nums2 = [6, 0, 4], k = 5
return [6, 7, 6, 0, 4]
Given nums1 = [3, 9], nums2 = [8, 9], k = 3
return [9, 8, 9]

LeetCode上的原题,请参见我之前的博客Create Maximum Number

class Solution {
public:
    /**
     * @param nums1 an integer array of length m with digits 0-9
     * @param nums2 an integer array of length n with digits 0-9
     * @param k an integer and k <= m + n
     * @return an integer array
     */
    vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {
        vector<int> res;
        int m = nums1.size(), n = nums2.size();
        for (int i = max(0, k - n); i <= min(k, m); ++i) {
            res = max(res, mergeVec(maxVec(nums1, i), maxVec(nums2, k - i)));
        }
        return res;
    }
    vector<int> maxVec(vector<int> nums, int k) {
        if (k == 0) return {};
        vector<int> res;
        int drop = nums.size() - k;
        for (auto a : nums) {
            while (drop && res.size() && res.back() < a) {
                res.pop_back();
                --drop;
            }
            res.push_back(a);
        }
        res.resize(k);
        return res;
    }
    vector<int> mergeVec(vector<int> nums1, vector<int> nums2) {
        vector<int> res;
        while (nums1.size() + nums2.size()) {
            vector<int> &t = nums1 > nums2 ? nums1 : nums2;
            res.push_back(t[0]);
            t.erase(t.begin());
        }
        return res;
    }
};

本文转自博客园Grandyang的博客,原文链接:创建最大数[LintCode] Create Maximum Number ,如需转载请自行联系原博主。

相关文章
|
9月前
|
缓存 druid 中间件
【YashanDB知识库】由于druid中间件配置导致的YAS-04003 maximum number of open cursors is 1000
【YashanDB知识库】由于druid中间件配置导致的YAS-04003 maximum number of open cursors is 1000
【YashanDB知识库】由于druid中间件配置导致的YAS-04003 maximum number of open cursors is 1000
【YashanDB知识库】YAS-04003 maximum number of open cursors is xxx
【YashanDB知识库】YAS-04003 maximum number of open cursors is xxx
【YashanDB知识库】YAS-04003 maximum number of open cursors is xxx
|
10月前
|
缓存 druid 中间件
【YashanDB 知识库】由于 druid 中间件配置导致的 YAS-04003 maximum number of open cursors is 1000
某客户Java业务运行时出现YAS-04003异常,导致业务无法正常运行,影响所有yashandb版本。原因是druid中间件配置不当,缓存PreparedStatement导致YashanDB open cursor超限。解决方法:增加OPEN_CURSORS参数值或修改druid配置,如将share-prepared-statements和pool-prepared-statements设为false。处理过程涉及查询vopen_cursor和v$sql视图,确认业务会话。经验总结:需结合Java框架及中间件配置与数据库视图分析行为。
|
10月前
【YashanDB 知识库】YAS-04003 maximum number of open cursors is xxx
**简介:** 应用运行时遇到错误“YAS-04003 maximum number of open cursors is 310”,原因是打开的游标数量超过默认限制(310)。建议检查代码,确保及时关闭不再使用的游标。如需增加限制,可通过命令 `alter system set OPEN_CURSORS=320;` 调整参数值。请参考官方文档以确定合适的数值。
|
算法
LeetCode 414. Third Maximum Number
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
265 0
LeetCode 414. Third Maximum Number
|
算法
LeetCode 321. Create Maximum Number
给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。 求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。
146 0
LeetCode 321. Create Maximum Number
LeetCode contest 190 5417. 定长子串中元音的最大数目 Maximum Number of Vowels in a Substring of Given Length
LeetCode contest 190 5417. 定长子串中元音的最大数目 Maximum Number of Vowels in a Substring of Given Length
|
算法
Leetcode 313. Super Ugly Number
题目翻译成中文是『超级丑数』,啥叫丑数?丑数就是素因子只有2,3,5的数,7 14 21不是丑数,因为他们都有7这个素数。 这里的超级丑数只是对丑数的一个扩展,超级丑数的素因子不再仅限于2 3 5,而是由题目给定一个素数数组。与朴素丑数算法相比,只是将素因子变了而已,解法还是和朴素丑数一致的。
207 1
|
存储 SQL 算法
LeetCode 题目 65:有效数字(Valid Number)【python】
LeetCode 题目 65:有效数字(Valid Number)【python】
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
184 0