|
1 | 1 | package com.fishercoder.solutions;
|
2 | 2 |
|
3 | 3 | /**
|
| 4 | + * 321. Create Maximum Number |
| 5 | + * |
4 | 6 | * Given two arrays of length m and n with digits 0-9 representing two numbers.
|
5 | 7 | * Create the maximum number of length k <= m + n from digits of the two.
|
6 | 8 | * The relative order of the digits from the same array must be preserved.
|
|
25 | 27 | return [9, 8, 9]
|
26 | 28 | */
|
27 | 29 | public class _321 {
|
28 |
| - public int[] maxNumber(int[] nums1, int[] nums2, int k) { |
29 |
| - int n = nums1.length; |
30 |
| - int m = nums2.length; |
31 |
| - int[] ans = new int[k]; |
32 |
| - for (int i = Math.max(0, k - m); i <= k && i <= n; ++i) { |
33 |
| - //what is this and why? |
34 |
| - int[] candidate = merge(maxArray(nums1, i), maxArray(nums2, k - i), k); |
35 |
| - if (greater(candidate, 0, ans, 0)) { |
36 |
| - ans = candidate; |
| 30 | + public static class Solution1 { |
| 31 | + public int[] maxNumber(int[] nums1, int[] nums2, int k) { |
| 32 | + int n = nums1.length; |
| 33 | + int m = nums2.length; |
| 34 | + int[] ans = new int[k]; |
| 35 | + for (int i = Math.max(0, k - m); i <= k && i <= n; ++i) { |
| 36 | + //what is this and why? |
| 37 | + int[] candidate = merge(maxArray(nums1, i), maxArray(nums2, k - i), k); |
| 38 | + if (greater(candidate, 0, ans, 0)) { |
| 39 | + ans = candidate; |
| 40 | + } |
37 | 41 | }
|
| 42 | + return ans; |
38 | 43 | }
|
39 |
| - return ans; |
40 |
| - } |
41 | 44 |
|
42 |
| - private boolean greater(int[] nums1, int i, int[] nums2, int j) { |
43 |
| - while (i < nums1.length && j < nums2.length && nums1[i] == nums2[j]) { |
44 |
| - i++; |
45 |
| - j++; |
| 45 | + private boolean greater(int[] nums1, int i, int[] nums2, int j) { |
| 46 | + while (i < nums1.length && j < nums2.length && nums1[i] == nums2[j]) { |
| 47 | + i++; |
| 48 | + j++; |
| 49 | + } |
| 50 | + return j == nums2.length || (i < nums1.length && nums1[i] > nums2[j]); |
46 | 51 | }
|
47 |
| - return j == nums2.length || (i < nums1.length && nums1[i] > nums2[j]); |
48 |
| - } |
49 | 52 |
|
50 |
| - private int[] merge(int[] nums1, int[] nums2, int k) { |
51 |
| - int[] ans = new int[k]; |
52 |
| - for (int i = 0, j = 0, r = 0; r < k; r++) { |
53 |
| - ans[r] = greater(nums1, i, nums2, j) ? nums1[i++] : nums2[j++]; |
| 53 | + private int[] merge(int[] nums1, int[] nums2, int k) { |
| 54 | + int[] ans = new int[k]; |
| 55 | + for (int i = 0, j = 0, r = 0; r < k; r++) { |
| 56 | + ans[r] = greater(nums1, i, nums2, j) ? nums1[i++] : nums2[j++]; |
| 57 | + } |
| 58 | + return ans; |
54 | 59 | }
|
55 |
| - return ans; |
56 |
| - } |
57 | 60 |
|
58 |
| - private int[] maxArray(int[] nums, int k) { |
59 |
| - int n = nums.length; |
60 |
| - int[] ans = new int[k]; |
61 |
| - for (int i = 0, j = 0; i < n; i++) { |
62 |
| - while (n - i + j > k && j > 0 && ans[j - 1] < nums[i]) { |
63 |
| - j--; |
64 |
| - } |
65 |
| - if (j < k) { |
66 |
| - ans[j++] = nums[i]; |
| 61 | + private int[] maxArray(int[] nums, int k) { |
| 62 | + int n = nums.length; |
| 63 | + int[] ans = new int[k]; |
| 64 | + for (int i = 0, j = 0; i < n; i++) { |
| 65 | + while (n - i + j > k && j > 0 && ans[j - 1] < nums[i]) { |
| 66 | + j--; |
| 67 | + } |
| 68 | + if (j < k) { |
| 69 | + ans[j++] = nums[i]; |
| 70 | + } |
67 | 71 | }
|
| 72 | + return ans; |
68 | 73 | }
|
69 |
| - return ans; |
70 | 74 | }
|
71 | 75 | }
|
0 commit comments