class Solution {
public int[] maxNumber(int[] nums1, int[] nums2, int k) {
int[] maxSequence = new int[k];
int length1 = nums1.length;
int length2 = nums2.length;
int start = Math.max(0,k - length2);
int end = Math.min(length1,k);
for(int i = start; i <= end; i++)
{
int[] maxSub1 = maxSubsequence(nums1, i);
int[] maxSub2 = maxSubsequence(nums2, k-i);
int[] curSub = merge(maxSub1, maxSub2);
if(compare(curSub,0,maxSequence,0)>0)
System.arraycopy(curSub, 0, maxSequence, 0, k);
}
return maxSequence;
}
public int[] maxSubsequence(int[] nums, int k) {
int [] maxSub = new int [k];
if(k==0)
return maxSub;
int len = nums.length;
int del = len - k;
maxSub[0] = nums[0];
int top = 0;
for(int i = 1;i< len;i++){
while(top>=0 && maxSub[top] < nums[i] && del>0){
top -= 1;
del -= 1;
}
if(top < k-1){
top += 1;
maxSub[top] = nums[i];
}
else
del--;
}
return maxSub;
}
public int[] merge(int[] subsequence1, int[] subsequence2)
{
int length1 = subsequence1.length;
int length2 = subsequence2.length;
int[] ans = new int[length1+length2];
if(subsequence1.length == 0)
return subsequence2;
if(subsequence2.length == 0)
return subsequence1;
int i =0;
int j =0;
int k = 0;
while(i<length1 && j<length2){
if(compare(subsequence1, i, subsequence2, j) > 0)
{
ans[k] = subsequence1[i];
i++;
k++;
}
else {
ans[k] = subsequence2[j];
j++;
k++;
}
}
while(i<length1){
ans[k] = subsequence1[i];
i++;
k++;
}
while(j<length2){
ans[k] = subsequence2[j];
j++;
k++;
}
return ans;
}
public int compare(int[] subsequence1, int index1, int[] subsequence2, int index2) {
int x = subsequence1.length, y = subsequence2.length;
while (index1 < x && index2 < y) {
int difference = subsequence1[index1] - subsequence2[index2];
if (difference != 0) {
return difference;
}
index1++;
index2++;
}
return (x - index1) - (y - index2);
}
}