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
Given nums1 = [3, 4, 6, 5]
, nums2 = [9, 1, 2, 5, 8, 3]
, k = 5
return [9, 8, 6, 5, 3]
Given nums1 = [6, 7]
, nums2 = [6, 0, 4]
, k = 5
return [6, 7, 6, 0, 4]
Given nums1 = [3, 9]
, nums2 = [8, 9]
, k = 3
return [9, 8, 9]
这道题是参考网上的解法,是道难题。。注意比较两个字符数串的大小 而不是当前字符数字的大小 (参考反例 60 604)
1 public class Solution { 2 /** 3 * @param nums1 an integer array of length m with digits 0-9 4 * @param nums2 an integer array of length n with digits 0-9 5 * @param k an integer and k <= m + n 6 * @return an integer array 7 */ 8 public int[] maxNumber(int[] nums1, int[] nums2, int k) { 9 // Write your code here 10 int len1 = nums1.length; 11 int len2 = nums2.length; 12 int[] res = new int[k]; 13 for(int i = Math.max(0, k-len2); i<=k&&i<=len1;i++){ 14 int[] temp = merge(maxArray(nums1, i), maxArray(nums2, k-i), k); 15 if(isGreater(temp, 0, res, 0)){ 16 res = temp; 17 } 18 } 19 return res; 20 } 21 22 private int[] maxArray(int[] nums, int len){ 23 int[] res = new int[len]; 24 int j = 0; 25 int n = nums.length; 26 for(int i=0; i<n;i++){ 27 while(j>0&&j+n-i>len&&res[j-1]<nums[i]){ 28 j--; 29 } 30 if(j<len){ 31 res[j] = nums[i]; 32 j++; 33 } 34 } 35 return res; 36 } 37 38 private int[] merge(int[] a, int[] b, int len){ 39 int[] res = new int[len]; 40 int len1 = a.length; 41 int len2 = b.length; 42 if(len1==0) return b; 43 if(len2==0) return a; 44 int i=0; int j=0; 45 int index=0; 46 while(i<len1||j<len2){ 47 if(isGreater(a, i, b, j)){ 48 res[index++]=a[i++]; 49 }else{ 50 res[index++]=b[j++]; 51 } 52 } 53 while(i<len1){ 54 res[index++]=a[i++]; 55 } 56 while(j<len2){ 57 res[index++]=b[j++]; 58 } 59 return res; 60 } 61 62 private boolean isGreater(int[] a, int posA, int[] b, int posB){ 63 int len1 = a.length; 64 int len2 = b.length; 65 int i=posA; int j=posB; 66 while(i<len1&&j<len2&&a[i]==b[j]){ 67 i++; 68 j++; 69 } 70 71 if(i==len1) return false; 72 if(j==len2) return true; 73 return a[i]>b[j]; 74 } 75 }