package com.interview.array; import java.util.Arrays; import java.util.Deque; import java.util.LinkedList; /** * Date 03/01/2016 * @author Tushar Roy * * 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 * * e.g * nums1 = [3, 4, 6, 5] * nums2 = [9, 1, 2, 5, 8, 3] * k = 5 * return [9, 8, 6, 5, 3] * * https://leetcode.com/problems/create-maximum-number/ */ public class MaxNumberFromTwoArray { public int[] maxNumber(int[] nums1, int[] nums2, int k) { int[] max = new int[k]; for (int i = 0; i <= k; i++) { if (nums1.length < i || nums2.length < k - i) { continue; } int[] a = merge(findLargest1(nums1, i), findLargest1(nums2, k - i)); if (isGreater(a, max, 0, 0)) { max = a; } } return max; } private int[] merge(int[] a1, int[] a2) { int[] result = new int[a1.length + a2.length]; int i = 0; int j = 0; int k = 0; while (i < a1.length || j < a2.length) { if (i == a1.length) { result[k++] = a2[j++]; } else if (j == a2.length) { result[k++] = a1[i++]; } else if (a1[i] > a2[j]) { result[k++] = a1[i++]; } else if (a1[i] < a2[j]) { result[k++] = a2[j++]; } else { if (isGreater(a1, a2, i, j)) { result[k++] = a1[i++]; } else { result[k++] = a2[j++]; } } } return result; } private boolean isGreater(int[] a, int[] b, int i, int j) { while (i < a.length && j < b.length) { if (a[i] > b[j]) { return true; } else if (a[i] < b[j]) { return false; } i++; j++; } return j == b.length; } private int[] findLargest1(int[] nums, int k) { if (k == 0) { return new int[0]; } int[] result = new int[k]; int index = 0; for (int i = 0; i < nums.length; i++) { while (index > 0 && index + (nums.length - i - 1) >= k && result[index - 1] < nums[i]) { index--; } if (index < k) { result[index++] = nums[i]; } } return result; } public static void main(String args[]) { MaxNumberFromTwoArray max = new MaxNumberFromTwoArray(); int[] input1 = {9,1,2,5,8,3}; int[] input2 = {3,4,6,5}; int[] input3 = {2,5,6,4,4,0}; int[] input4 = {7,3,8,0,6,5,7,6,2}; int[] result = max.maxNumber(input3, input4, 15); System.out.print(Arrays.toString(result)); } }