Welcome to Subscribe On Youtube
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
-
class Solution { public int[] maxNumber(int[] nums1, int[] nums2, int k) { int m = nums1.length, n = nums2.length; int l = Math.max(0, k - n), r = Math.min(k, m); int[] ans = new int[k]; for (int x = l; x <= r; ++x) { int[] arr1 = f(nums1, x); int[] arr2 = f(nums2, k - x); int[] arr = merge(arr1, arr2); if (compare(arr, ans, 0, 0)) { ans = arr; } } return ans; } private int[] f(int[] nums, int k) { int n = nums.length; int[] stk = new int[k]; int top = -1; int remain = n - k; for (int x : nums) { while (top >= 0 && stk[top] < x && remain > 0) { --top; --remain; } if (top + 1 < k) { stk[++top] = x; } else { --remain; } } return stk; } private int[] merge(int[] nums1, int[] nums2) { int m = nums1.length, n = nums2.length; int i = 0, j = 0; int[] ans = new int[m + n]; for (int k = 0; k < m + n; ++k) { if (compare(nums1, nums2, i, j)) { ans[k] = nums1[i++]; } else { ans[k] = nums2[j++]; } } return ans; } private boolean compare(int[] nums1, int[] nums2, int i, int j) { if (i >= nums1.length) { return false; } if (j >= nums2.length) { return true; } if (nums1[i] > nums2[j]) { return true; } if (nums1[i] < nums2[j]) { return false; } return compare(nums1, nums2, i + 1, j + 1); } }
-
class Solution { public: vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) { auto f = [](vector<int>& nums, int k) { int n = nums.size(); vector<int> stk(k); int top = -1; int remain = n - k; for (int x : nums) { while (top >= 0 && stk[top] < x && remain > 0) { --top; --remain; } if (top + 1 < k) { stk[++top] = x; } else { --remain; } } return stk; }; function<bool(vector<int>&, vector<int>&, int, int)> compare = [&](vector<int>& nums1, vector<int>& nums2, int i, int j) -> bool { if (i >= nums1.size()) { return false; } if (j >= nums2.size()) { return true; } if (nums1[i] > nums2[j]) { return true; } if (nums1[i] < nums2[j]) { return false; } return compare(nums1, nums2, i + 1, j + 1); }; auto merge = [&](vector<int>& nums1, vector<int>& nums2) { int m = nums1.size(), n = nums2.size(); int i = 0, j = 0; vector<int> ans(m + n); for (int k = 0; k < m + n; ++k) { if (compare(nums1, nums2, i, j)) { ans[k] = nums1[i++]; } else { ans[k] = nums2[j++]; } } return ans; }; int m = nums1.size(), n = nums2.size(); int l = max(0, k - n), r = min(k, m); vector<int> ans(k); for (int x = l; x <= r; ++x) { vector<int> arr1 = f(nums1, x); vector<int> arr2 = f(nums2, k - x); vector<int> arr = merge(arr1, arr2); if (ans < arr) { ans = move(arr); } } return ans; } };
-
class Solution: def maxNumber(self, nums1: List[int], nums2: List[int], k: int) -> List[int]: def f(nums: List[int], k: int) -> List[int]: n = len(nums) stk = [0] * k top = -1 remain = n - k for x in nums: while top >= 0 and stk[top] < x and remain > 0: top -= 1 remain -= 1 if top + 1 < k: top += 1 stk[top] = x else: remain -= 1 return stk def compare(nums1: List[int], nums2: List[int], i: int, j: int) -> bool: if i >= len(nums1): return False if j >= len(nums2): return True if nums1[i] > nums2[j]: return True if nums1[i] < nums2[j]: return False return compare(nums1, nums2, i + 1, j + 1) def merge(nums1: List[int], nums2: List[int]) -> List[int]: m, n = len(nums1), len(nums2) i = j = 0 ans = [0] * (m + n) for k in range(m + n): if compare(nums1, nums2, i, j): ans[k] = nums1[i] i += 1 else: ans[k] = nums2[j] j += 1 return ans m, n = len(nums1), len(nums2) l, r = max(0, k - n), min(k, m) ans = [0] * k for x in range(l, r + 1): arr1 = f(nums1, x) arr2 = f(nums2, k - x) arr = merge(arr1, arr2) if ans < arr: ans = arr return ans
-
func maxNumber(nums1 []int, nums2 []int, k int) []int { m, n := len(nums1), len(nums2) l, r := max(0, k-n), min(k, m) f := func(nums []int, k int) []int { n := len(nums) stk := make([]int, k) top := -1 remain := n - k for _, x := range nums { for top >= 0 && stk[top] < x && remain > 0 { top-- remain-- } if top+1 < k { top++ stk[top] = x } else { remain-- } } return stk } var compare func(nums1, nums2 []int, i, j int) bool compare = func(nums1, nums2 []int, i, j int) bool { if i >= len(nums1) { return false } if j >= len(nums2) { return true } if nums1[i] > nums2[j] { return true } if nums1[i] < nums2[j] { return false } return compare(nums1, nums2, i+1, j+1) } merge := func(nums1, nums2 []int) []int { m, n := len(nums1), len(nums2) ans := make([]int, m+n) i, j := 0, 0 for k := range ans { if compare(nums1, nums2, i, j) { ans[k] = nums1[i] i++ } else { ans[k] = nums2[j] j++ } } return ans } ans := make([]int, k) for x := l; x <= r; x++ { arr1 := f(nums1, x) arr2 := f(nums2, k-x) arr := merge(arr1, arr2) if compare(arr, ans, 0, 0) { ans = arr } } return ans }
-
function maxNumber(nums1: number[], nums2: number[], k: number): number[] { const m = nums1.length; const n = nums2.length; const l = Math.max(0, k - n); const r = Math.min(k, m); let ans: number[] = Array(k).fill(0); for (let x = l; x <= r; ++x) { const arr1 = f(nums1, x); const arr2 = f(nums2, k - x); const arr = merge(arr1, arr2); if (compare(arr, ans, 0, 0)) { ans = arr; } } return ans; } function f(nums: number[], k: number): number[] { const n = nums.length; const stk: number[] = Array(k).fill(0); let top = -1; let remain = n - k; for (const x of nums) { while (top >= 0 && stk[top] < x && remain > 0) { --top; --remain; } if (top + 1 < k) { stk[++top] = x; } else { --remain; } } return stk; } function compare(nums1: number[], nums2: number[], i: number, j: number): boolean { if (i >= nums1.length) { return false; } if (j >= nums2.length) { return true; } if (nums1[i] > nums2[j]) { return true; } if (nums1[i] < nums2[j]) { return false; } return compare(nums1, nums2, i + 1, j + 1); } function merge(nums1: number[], nums2: number[]): number[] { const m = nums1.length; const n = nums2.length; const ans: number[] = Array(m + n).fill(0); let i = 0; let j = 0; for (let k = 0; k < m + n; ++k) { if (compare(nums1, nums2, i, j)) { ans[k] = nums1[i++]; } else { ans[k] = nums2[j++]; } } return ans; }