Skip to content

Instantly share code, notes, and snippets.

@cangoal
Created April 17, 2016 04:19
Show Gist options
  • Save cangoal/1034966f874b3a713cde23a0624ac7cd to your computer and use it in GitHub Desktop.
Save cangoal/1034966f874b3a713cde23a0624ac7cd to your computer and use it in GitHub Desktop.
LeetCode - Create Maximum Number
// Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum number of length k <= 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 k digits. You should try to optimize your 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]
public int[] maxNumber(int[] nums1, int[] nums2, int k) {
int n = nums1.length, m = nums2.length;
int[] res = new int[k];
for(int i = Math.max(k - m, 0); i <= k && i <= n; i++){
int[] candidate = merge(maxArray(nums1, i), maxArray(nums2, k - i), k);
if(greater(candidate, 0 , res, 0)) res = candidate;
}
return res;
}
private int[] maxArray(int[] nums, int k){
int[] res = new int[k];
int n = nums.length;
for(int i = 0, j = 0; i < n; i++){
while(n - i + j > k && j > 0 && res[j - 1] < nums[i]) j--;
if(j < k) res[j++] = nums[i];
}
return res;
}
private boolean greater(int[] nums1, int i, int[] nums2, int j){
while(i < nums1.length && j < nums2.length && nums1[i] == nums2[j]){
i++;
j++;
}
return (j == nums2.length) || (i < nums1.length && nums1[i] > nums2[j]);
}
private int[] merge(int[] nums1, int[] nums2, int k){
int i = 0, j = 0, r = 0;
int[] res = new int[k];
while(r < k){
res[r++] = greater(nums1, i, nums2, j) ? nums1[i++] : nums2[j++];
}
return res;
}
@AndrewLisuxin
Copy link

can you prove the correctness of maxArray() and greater()?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment