LintCode_552 Create Maximum Number

来源:互联网 发布:电脑硬件温度监控软件 编辑:程序博客网 时间:2024/05/20 02:54

Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum number of lengthk <= 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 kdigits. You should try to optimize your time and space complexity.

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]


又是一道么做出来的题目, 感觉自己是在太水了:

指定一个数组的长度, 然后按照题意把那个数组找出来, 然后把两个数组合并, 注意合并的算法, 实现比较简洁


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) {        // Write your code here        int len1 = nums1.size(), len2 = nums2.size();        vector<int> results;        for (int k1 = max(k - len2, 0); k1 <= min(k, len1); ++k1)            results = max(results, connect(maxNumber(nums1, k1), maxNumber(nums2, k - k1)));        return results;    }    vector<int> maxNumber(vector<int> nums, int k) {        int drop = nums.size() - k;        vector<int> results;        for (int num : nums) {            while (drop && results.size() && results.back() < num) {                results.pop_back();                drop--;            }            results.push_back(num);        }        results.resize(k);        return results;    }    vector<int> connect(vector<int> nums1, vector<int> nums2) {        vector<int> results;        while (nums1.size() + nums2.size()) {            vector<int>& now = nums1 > nums2 ? nums1 : nums2;            results.push_back(now[0]);            now.erase(now.begin());        }        return results;    }};





0 0