zoukankan      html  css  js  c++  java
  • 321. 拼接最大数 (JAVA)

    给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。

    求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。

    说明: 请尽可能地优化你算法的时间和空间复杂度。

    示例 1:

    输入:
    nums1 = [3, 4, 6, 5]
    nums2 = [9, 1, 2, 5, 8, 3]
    k = 5
    输出:
    [9, 8, 6, 5, 3]
    示例 2:

    输入:
    nums1 = [6, 7]
    nums2 = [6, 0, 4]
    k = 5
    输出:
    [6, 7, 6, 0, 4]
    示例 3:

    输入:
    nums1 = [3, 9]
    nums2 = [8, 9]
    k = 3
    输出:
    [9, 8, 9]

    class Solution {
        public int[] maxNumber(int[] nums1, int[] nums2, int k) {
            int[] res1;
            int[] res2;
            int[] res;
            int[] maxRes = null;
            for(int i = 0; i <= k && i<=nums1.length; i++) {
                if(nums2.length < k-i) {
                    continue;
                }
                res1 = getMaxK(nums1, i);
                res2 = getMaxK(nums2, k-i);
                res = mergeList(res1, res2);
    
                if(maxRes == null || isGreater(res, maxRes)) {
                    maxRes = res;
                }
            }
            return maxRes;
        }
    
        private int[] getMaxK(int[] nums, int k){
            int[] res = new int[k];
            int index = 0;
            for(int i = 0; i < nums.length; i++){
                //贪心法,把大的数字尽量往高位放
                while(index > 0 && nums.length-i > k-index && nums[i] > res[index-1]) {
                    index--;
                }
                if(index < k) {
                    res[index++] = nums[i];
                }
            }
            return res;
        }
    
        private int[] mergeList(int[] nums1, int[] nums2){
            int[] sum = new int[nums1.length+nums2.length];
            for(int i=0,a=0,b=0;i<sum.length;i++){
                sum[i]=greater(nums1,nums2,a,b)?nums1[a++]:nums2[b++];
            }
            return sum;
        }
    
        private boolean greater(int[] nums1,int[] nums2,int i,int j){
            //如果当前数字大小相等,那么得看下一位哪个数字大
            while(i<nums1.length&&j<nums2.length&&nums1[i]==nums2[j]){
                i++;
                j++;
            }
            return j==nums2.length||(i<nums1.length&&nums1[i]>nums2[j]);
        }
    
        private boolean isGreater(int[] nums1, int[] nums2) {
            if(nums1.length > nums2.length) {
                return true;
            } else if(nums1.length < nums2.length) {
                return false;
            } else {
                for(int i = 0; i < nums1.length; i++){
                    if(nums1[i] > nums2[i]) {
                        return true;
                    } else if(nums1[i] < nums2[i]) {
                        return false;
                    }
                }
            }
            return false;
        }
    }
  • 相关阅读:
    ios UIWebView截获html并修改便签内容(转载)
    IOS获取系统时间 NSDate
    ios 把毫秒值转换成日期 NSDate
    iOS  如何判断当前网络连接状态  网络是否正常  网络是否可用
    IOS开发 xcode报错之has been modified since the precompiled header was built
    iOS系统下 的手机屏幕尺寸 分辨率 及系统版本 总结
    iOS 切图使用 分辨率 使用 相关总结
    整合最优雅SSM框架:SpringMVC + Spring + MyBatis 基础
    Java面试之PO,VO,TO,QO,BO
    Notes模板说明
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/14141896.html
Copyright © 2011-2022 走看看