Skip to content

Create Maximum Number

Tim_Gao edited this page Sep 16, 2016 · 1 revision
  1. how to merge two subarrays, what if n1[p1] == n2[p2], which one to pick
    You have to compare each element in n1 and n2 until one is larger than the other or the one with larger length should be chosen
public class Solution {
    private int[] getMaxNum(int[] nums, int len){
        int[] res = new int[len];
        if (len == 0){
            return res;
        }
        Stack<Integer> st = new Stack<>();
        for (int i=0; i<nums.length; ++i){
            while (!st.isEmpty() && nums[i] > st.peek() && st.size() + nums.length-i > len){
                st.pop();
            }
            if (st.size() < len){
                st.push(nums[i]);
            }
        }
        int p = len-1;
        while (!st.isEmpty()){
            res[p--] = st.pop();
        }
        return res;
    }
    private boolean n1GTn2(int[] n1, int p1, int[] n2, int p2){
        if(p1 >= n1.length){
            return false;
        } else if (p2 >= n2.length){
            return true;
        }
        int larger = -1;
        while (p1 < n1.length && p2 < n2.length){
            if (n1[p1] > n2[p2]){
                larger = 1;
                break;
            } else if(n1[p1] < n2[p2]){
                larger = 2;
                break;
            }
            ++p1;
            ++p2;
        }
        if (larger == 1){
            return true;
        } else if (larger == 2){
            return false;
        }
        return p1 < n1.length;
    }
    private int[] merge(int[] n1, int[] n2){
        int[] res = new int[n1.length + n2.length];
        int p1 = 0, p2 = 0, p = 0;
        while (p1 < n1.length || p2 < n2.length){
            if (n1GTn2(n1, p1, n2, p2)){
                res[p++] = n1[p1++];
            } else {
                res[p++] = n2[p2++];
            }
        }
        return res;
    }
    private boolean gt(int[] n1, int[] n2){
        for (int i=0; i<n1.length; ++i){
            if (n1[i] > n2[i]){
                return true;
            } else if (n1[i] < n2[i]){
                return false;
            }
        }
        return true;
    }
    public int[] maxNumber(int[] nums1, int[] nums2, int k) {
        int[] res = new int[k];
        for (int i=0; i<=k; ++i){
            if (nums1.length >= i && nums2.length >= k-i){
                int[] n1 = getMaxNum(nums1, i);
                int[] n2 = getMaxNum(nums2, k-i);
                int[] crt = merge(n1, n2);
                if (gt(crt, res)){
                    res = crt;
                }
            }
        }
        return res;
    }
}

Clone this wiki locally