Skip to content

Instantly share code, notes, and snippets.

@cangoal
Created April 17, 2016 04:19
Show Gist options
  • Select an option

  • Save cangoal/1034966f874b3a713cde23a0624ac7cd to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown

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