Skip to content

321. Create Maximum Number

Description

You are given two integer arrays nums1 and nums2 of lengths m and n respectively. nums1 and nums2 represent the digits of two numbers. You are also given an integer k.

Create the maximum number of length k <= m + n from digits of the two numbers. The relative order of the digits from the same array must be preserved.

Return an array of the k digits representing the answer.

 

Example 1:

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

Example 2:

Input: nums1 = [6,7], nums2 = [6,0,4], k = 5
Output: [6,7,6,0,4]

Example 3:

Input: nums1 = [3,9], nums2 = [8,9], k = 3
Output: [9,8,9]

 

Constraints:

  • m == nums1.length
  • n == nums2.length
  • 1 <= m, n <= 500
  • 0 <= nums1[i], nums2[i] <= 9
  • 1 <= k <= m + n

 

Solutions

Solution: Greedy

  • Time complexity: O(k(m+n)2)
  • Space complexity: O(m+n)

 

JavaScript

js
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @param {number} k
 * @return {number[]}
 */
const maxNumber = function (nums1, nums2, k) {
  const m = nums1.length;
  const n = nums2.length;
  let result = [];

  const sliceNums = (nums, count) => {
    const result = [];
    let drop = nums.length - count;

    for (const num of nums) {
      while (drop && result.at(-1) < num) {
        result.pop();
        drop -= 1;
      }
      result.push(num);
    }
    return result.slice(0, count);
  };
  const isGreater = (numsA, numsB, a = 0, b = 0) => {
    while (a < numsA.length && b < numsB.length) {
      if (numsA[a] > numsB[b]) return true;
      if (numsA[a] < numsB[b]) return false;
      a += 1;
      b += 1;
    }
    return a < numsA.length;
  };
  const mergeSlice = (numsA, numsB) => {
    const result = [];
    let a = (b = 0);

    while (a < numsA.length || b < numsB.length) {
      isGreater(numsA, numsB, a, b) ? result.push(numsA[a++]) : result.push(numsB[b++]);
    }
    return result;
  };

  for (let count = Math.max(0, k - n); count <= Math.min(m, k); count++) {
    const slice1 = sliceNums(nums1, count);
    const slice2 = sliceNums(nums2, k - count);
    const mergeResult = mergeSlice(slice1, slice2);

    if (isGreater(result, mergeResult)) continue;
    result = mergeResult;
  }
  return result;
};

Released under the MIT license