Create Maximum Number

http://www.lintcode.com/zh-cn/problem/create-maximum-number/

package com.LintCode.CreateMaximum;

import java.util.LinkedList;

public class Solution {
    private int[] res = null;

    /*
     * @param nums1: an integer array of length m with digits 0-9
     * @param nums2: an integer array of length n with digits 0-9
     * @param k: an integer and k <= m + n
     * @return: an integer array
     */
    public int[] maxNumber(int[] nums1, int[] nums2, int k) {
        // write your code here
        int m = nums1.length;
        int n = nums2.length;
        int[] ints = new int[0];
        if (m + n < k || k <= 0) {
            return ints;
        }
        for (int i = 0; i <= k; i++) {
//            第一个数组取i个,第二个数组取k-i个
            if (m < i || n < k - i) {
                continue;
            }
            merge(getList(nums1, i), getList(nums2, k - i), k);
        }
        return res;
    }

    /**
     * 从一个数组中取k个数
     *
     * @param nums
     * @param k
     * @return
     */
    private LinkedList getList(int[] nums, int k) {
        LinkedList list = new LinkedList();
        if (k == 0) {
//            k为0时直接返回
            return list;
        }
        for (int i = 0; i < nums.length; i++) {
            list.add(nums[i]);
//            一直添加
            if (list.size() > k) {
//                当元素个数大于k时,从头开始遍历,找到第一个比后边小的数,删除它
                for (int j = 0; j < list.size() - 1; j++) {
                    if (list.get(j) < list.get(j + 1)) {
                        list.remove(j);
                        break;
                    }
                }
//                如果找不到,就删除最后一个
                if (list.size() > k) {
                    list.removeLast();
                }
            }
        }
        return list;
    }

    /**
     * 合并出来最大的数
     *
     * @param list1
     * @param list2
     * @param k
     */
    private void merge(LinkedList list1, LinkedList list2, int k) {
        if (res == null) {
            res = new int[k];
        }
        boolean isBigger = false;
        int[] temp = new int[k];
        for (int l = 0; l < k; l++) {
//            找到两个里边第一个元素大的那个
            boolean firstBigger = isFirstBigger(list1, list2);
            int key = Integer.MIN_VALUE;
//            找到这次要添加的元素。
            if (firstBigger) {
                key = list1.removeFirst();
            } else {
                key = list2.removeFirst();
            }
//            和结果集进行比较,如果已经比结果小了,就没有进行下去的必要。
            if (key < res[l] && !isBigger) {
                return;
            }
            if (key > res[l]) {
                isBigger = true;
            }
            temp[l] = key;
        }
        res = temp;
    }

    private boolean isFirstBigger(LinkedList list1, LinkedList list2) {
//        有一个为空,直接返回另外一个
        if (list1 == null || list1.isEmpty()) {
            return false;
        }
        if (list2 == null || list2.isEmpty()) {
            return true;
        }
        for (int i = 0; i > -1; i++) {
//            有一个长度不够了,返回另外一个
            if (i >= list1.size()) {
                return false;
            }
            if (i >= list2.size()) {
                return true;
            }
//            返回大的那个,如果相等,比较下一个元素
            if (list1.get(i) > list2.get(i)) {
                return true;
            }
            if (list1.get(i) < list2.get(i)) {
                return false;
            }
        }
        return true;
    }

}

你可能感兴趣的:(Create Maximum Number)