zoukankan      html  css  js  c++  java
  • Create Maximum Number

    Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum number of length k <= m + n from digits of the two. The relative order of the digits from the same array must be preserved. Return an array of the k digits. You should try to optimize your time and space complexity.

    Example

    Given nums1 = [3, 4, 6, 5], nums2 = [9, 1, 2, 5, 8, 3], k = 5
    return [9, 8, 6, 5, 3]

    Given nums1 = [6, 7], nums2 = [6, 0, 4], k = 5
    return [6, 7, 6, 0, 4]

    Given nums1 = [3, 9], nums2 = [8, 9], k = 3
    return [9, 8, 9]

    这道题是参考网上的解法,是道难题。。注意比较两个字符数串的大小 而不是当前字符数字的大小 (参考反例 60 604)
     
     1 public class Solution {
     2     /**
     3      * @param nums1 an integer array of length m with digits 0-9
     4      * @param nums2 an integer array of length n with digits 0-9
     5      * @param k an integer and k <= m + n
     6      * @return an integer array
     7      */
     8     public int[] maxNumber(int[] nums1, int[] nums2, int k) {
     9         // Write your code here
    10         int len1 = nums1.length;
    11         int len2 = nums2.length;
    12         int[] res = new int[k];
    13         for(int i = Math.max(0, k-len2); i<=k&&i<=len1;i++){
    14             int[] temp = merge(maxArray(nums1, i), maxArray(nums2, k-i), k);
    15             if(isGreater(temp, 0, res, 0)){
    16                 res = temp;
    17             }
    18         }
    19         return res;
    20     }
    21 
    22     private int[] maxArray(int[] nums, int len){
    23         int[] res = new int[len];
    24         int j = 0;
    25         int n = nums.length;
    26         for(int i=0; i<n;i++){
    27             while(j>0&&j+n-i>len&&res[j-1]<nums[i]){
    28                 j--;
    29             }
    30             if(j<len){
    31                 res[j] = nums[i];
    32                 j++;
    33             }
    34         }
    35         return res;
    36     }
    37 
    38     private int[] merge(int[] a, int[] b, int len){
    39         int[] res = new int[len];
    40         int len1 = a.length;
    41         int len2 = b.length;
    42         if(len1==0) return b;
    43         if(len2==0) return a;
    44         int i=0; int j=0;
    45         int index=0;
    46         while(i<len1||j<len2){
    47             if(isGreater(a, i, b, j)){
    48                 res[index++]=a[i++];
    49             }else{
    50                 res[index++]=b[j++];
    51             }
    52         }
    53         while(i<len1){
    54             res[index++]=a[i++];
    55         }
    56         while(j<len2){
    57             res[index++]=b[j++];
    58         }
    59         return res;
    60     }
    61 
    62     private boolean isGreater(int[] a, int posA, int[] b, int posB){
    63         int len1 = a.length;
    64         int len2 = b.length;
    65         int i=posA; int j=posB;
    66         while(i<len1&&j<len2&&a[i]==b[j]){
    67             i++;
    68             j++;
    69         }
    70         
    71         if(i==len1) return false;
    72         if(j==len2) return true;
    73         return a[i]>b[j];
    74     }
    75 }
  • 相关阅读:
    luoguP2016 战略游戏
    [Usaco2006 Nov]Corn Fields牧场的安排
    [Ahoi2009]self 同类分布
    POJ3208:Apocalypse Someday
    [usaco2010 Oct]Soda Machine
    [Usaco2005 Dec]Scales 天平
    PTA的Python练习题(十九)
    堆叠注入
    PHP序列化与反序列化(三)总结实战
    攻防世界web进阶1-12总结篇
  • 原文地址:https://www.cnblogs.com/xinqiwm2010/p/6836093.html
Copyright © 2011-2022 走看看