321. Create Maximum Number

321. Create Maximum Number

題目連接:https://leetcode.com/problems...git

這題就遍歷全部可能的切分點n而後mergenums1[n]nums2[k-n]求到最大值,nums1[n]nums2[k-n]分別是nums1有n個數時候的最大值,和nums2有k-n個數時的最大值。merge部分比較簡單,來看求最大值的部分。
設產生的最大值是max,max的size是n,num的size是m。如今已經選了了i個digit,最大值是max[0:i],num用了j個數,如今指向num[j]。那麼這就是用stack能夠解決的問題了,若是stack的top元素小於num[j]且剩下的digits還夠的話,那就一直pop,而後把num[j]放進棧頂,剩下的digits夠的條件是:m - j >= n - i,因此能夠pop的條件也就是:
while(i > 0 && m - j > n - i && num[j] > max[i])code

如今來肯定切分點n的範圍:0 <= n <= nums1.length而且0 <= k - n <= nums2.length,也就是k - num2.length <= n <= k,因此最後n的範圍是:max(0, k-num2.length) <= n <= min(nums1.length, k)ip

merge的時候注意,若是兩個array裏面當前int相同,要比較它們以後的數字,選大的。leetcode

參考:
https://discuss.leetcode.com/...get

public class Solution {
    public int[] maxNumber(int[] nums1, int[] nums2, int k) {
        int[] global = new int[k];
        if(k == 0) return global;
        
        for(int n = Math.max(0, k-nums2.length); n <= Math.min(nums1.length, k); n++) {
            int[] max1 = getLocalMax(nums1, n);
            int[] max2 = getLocalMax(nums2, k-n);
        
            int[] temp = merge(max1, max2);
            if(greater(temp, 0, global, 0)) global = temp;
        }
        
        return global;
    }
    
    private boolean greater(int[] a, int i, int[] b, 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++;
        }
        // equal is false
        return i < a.length;
    }
    
    private int[] getLocalMax(int[] num, int n) {
        int[] res = new int[n];
        int m = num.length;
        int i = 0;
        for(int j = 0; j < m; j++) {
            while(i > 0 && m - j > n - i && num[j] > res[i-1]) i--;
            if(i < n) res[i++] = num[j];
        }
        return res;
    }
    
    private int[] merge(int[] num1, int[] num2) {
        int n1 = num1.length, n2 = num2.length;
        int[] res = new int[n1+n2];
        
        int i = 0, j = 0;
        for(int k = 0; k < res.length; k++) {
            if(i >= n1) res[k] = num2[j++];
            else if(j >= n2) res[k] = num1[i++];
            else res[k] = greater(num1, i, num2, j) ? num1[i++] : num2[j++];
        }
        return res;
    }
}
相關文章
相關標籤/搜索