LeetCode[321] Create Maximum Number
Given two arrays of length m and n with digits 0-9 representing two
Create the maximum number of length k <= m + n from digits of
The relative order of the digits from the same array must be
Return an array of the k digits. You should try to optimize
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]
Greedy算法
复杂度
O(k * (m + n)^3), O(k)
思路
贪心算法,先能组成k的数的组合,然后针对每一个组合(k = m + n),考虑每一个数组能够组成的最大的m位(或者n位)数。将这两个数组形成的数进行merge,得到针对这个组合下能得到的最大的数,然后记录下来。对不同组合生成的最大数进行比较,得到所能得到的最大的值。
代码
public int[] maxNumber(int[] nums1, int[] nums2, int k) {
List<Integer> list = new LinkedList<>();
int[] ans = new int[k];
for(int i = 0; i <= k; i ++) {
if(i <= nums1.length && k - i <= nums2.length) {
int[] res = merge(maxNum(nums1, i), maxNum(nums2, k - i), k);
if(larger(res, ans, 0, 0)) ans = res;
}
}
return ans;
}
// find the larger array;
// return true when res value >= ans calue;
public boolean larger(int[] res, int[] ans, int r, int a) {
while(r < res.length && a < ans.length && res[r] == ans[a]) {
r ++;
a ++;
}
return a == ans.length || (r < res.length && res[r] > ans[a]);
}
// find the max number that can be formed in the nums, with i digits.
// use greedy的方法去找这个数。
public int[] maxNum(int[] nums, int k) {
int[] res = new int[k];
int j = 0, n = nums.length;
for(int i = 0; i < nums.length; i ++) {
// 因为要保证顺序,所以n - i > k - j, 同时,如果发现之前那一位比现在这一位要小的话,就replace成new value
while(n - i + j > k && j > 0 && res[j - 1] < nums[i]) j --;
if(j < k) res[j++] = nums[i];
}
return res;
}
// merge the two nums value that forms k digits;
public int[] merge(int[] nums1, int[] nums2, int k) {
int[] res = new int[k];
int i = 0, j = 0;
for(int index = 0; index < k; index ++) {
// 关键比较的时候要这样比较,不能直接取大的值,而是要取从这一位开始能够组成最大的数的值。
res[index] = larger(nums1, nums2, i, j) ? nums1[i ++] : nums2[j ++];
}
return res;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。