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 1:
nums1 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
return [9, 8, 6, 5, 3] Example 2:
nums1 = [6, 7]
nums2 = [6, 0, 4]
k = 5
return [6, 7, 6, 0, 4] Example 3:
nums1 = [3, 9]
nums2 = [8, 9]
k = 3
return [9, 8, 9]

We can use greedy method to solve this.

num1 can take charge of i(0<=i<=k) numbers and num2 can the charge of the rest k-i numbers

Now the question is: how to get maximum number(x digits) from an array

Recall Remove Duplicate Letters, we can use a stack. we scan the array, when the stack is not empty, and current integer in the array is greater than current stack peek(), we pop the stack, as long as the rest of the array can gurantee to provide enough integers to form an integer of k bits.

Now we have two maximum array, with one size of i and another size of k-i, now we should combine the two into one maximum integer

It's like merge sort.

But pay attention to the case where two digit are equal, which to choose?

example:

6 0

6 0 4

we should choose the second 6 first. So we should write a compare function that compare two array till the end, not just the current two digits.

参考:http://algobox.org/2015/12/24/create-maximum-number/

 public class Solution {
public int[] maxNumber(int[] nums1, int[] nums2, int k) {
int len1 = nums1.length;
int len2 = nums2.length;
int[] res = new int[k];
for (int i=Math.max(0, k-len2); i<=k && i<=len1; i++) {
int[] temp = merge(maxArray(nums1, i), maxArray(nums2, k-i), k);
if (isgreater(temp, 0, res, 0))
res = temp;
}
return res;
} public int[] merge(int[] arr1, int[] arr2, int k) {
int[] res = new int[k];
if (arr1.length == 0) return arr2;
if (arr2.length == 0) return arr1;
int cur = 0, i = 0, j = 0;
int len1 = arr1.length, len2 = arr2.length;
while (i<len1 && j<len2) {
if (isgreater(arr1, i, arr2, j)) {
res[cur++] = arr1[i++];
}
else res[cur++] = arr2[j++];
}
while (i < len1) {
res[cur++] = arr1[i++];
}
while (j < len2) {
res[cur++] = arr2[j++];
}
return res;
} public int[] maxArray(int[] arr, int count) {
int[] res = new int[count];
if (count == 0) return res;
int n = arr.length;
int j = 0; //stack head next
for (int i=0; i<n; i++) {
while (j>0 && n-i-1>=count-j && res[j-1]<arr[i]) { //stack head can be poped
j--;
}
if (j<count) {
res[j] = arr[i];
j++;
}
}
return res;
} public boolean isgreater(int[] arr1, int i1, int[] arr2, int i2) {
int len1 = arr1.length, len2 = arr2.length;
while (i1<len1 && i2<len2 && arr1[i1]==arr2[i2]) {
i1++;
i2++;
}
if (i1 == len1) return false;
if (i2 == len2) return true;
return arr1[i1]>arr2[i2];
}
}

Leetcode: Create Maximum Number的更多相关文章

  1. [LeetCode] Create Maximum Number 创建最大数

    Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb ...

  2. leetcode 402. Remove K Digits 、321. Create Maximum Number

    402. Remove K Digits https://www.cnblogs.com/grandyang/p/5883736.html https://blog.csdn.net/fuxuemin ...

  3. [LintCode] Create Maximum Number 创建最大数

    Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb ...

  4. 402. Remove K Digits/738.Monotone Increasing Digits/321. Create Maximum Number

    Given a non-negative integer num represented as a string, remove k digits from the number so that th ...

  5. 321. Create Maximum Number 解题方法详解

    321. Create Maximum Number 题目描述 Given two arrays of length m and n with digits 0-9 representing two ...

  6. 321. Create Maximum Number

    /* * 321. Create Maximum Number * 2016-7-6 by Mingyang */ public int[] maxNumber(int[] nums1, int[] ...

  7. [LeetCode] 321. Create Maximum Number 创建最大数

    Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb ...

  8. LeetCode 321. Create Maximum Number

    原题链接在这里:https://leetcode.com/problems/create-maximum-number/description/ 题目: Given two arrays of len ...

  9. [Swift]LeetCode321. 拼接最大数 | Create Maximum Number

    Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb ...

随机推荐

  1. Lazarus开发平台编译后的可执行程序的减肥方法

    1.在“工程”菜单下,单击“工程选项”,原始状态的界面为: 2.将界面中的两个选项修改为如下: 3.按“确定”按钮,即可 编译以后的可执行程序就将又原来的14m变为1.66m. 1.选择: Proje ...

  2. PDO知识

    PDO: 一.含义: 数据访问抽象层 二.作用 :通过PDO能够访问其它的数据库 三. 用法: 1.造对象 ①$dsn="mysql:dbname=zz;host=localhost&quo ...

  3. MessageQueue 一 简单的创建和读取

    创建一个队列,并写入数据 在读取出来 using System; using System.Collections.Generic; using System.Linq; using System.M ...

  4. Java高级之内存模型分析

    博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 下文是博主感悟,请带着怀疑性的态度阅读! 需要了解基本变量所占 ...

  5. 移动设备优先viewport

    Bootstrap 3 的设计目标是移动设备优先,然后才是桌面设备.这实际上是一个非常及时的转变,因为现在越来越多的用户使用移动设备. 为了让 Bootstrap 开发的网站对移动设备友好,确保适当的 ...

  6. php---将数组转化为数组对象

    例子:array(1){ [0]=>array( 'id'=>111, 'name'=>'aaaa' ) } 由上面的例子转化成下面对象,怎么转化?急急 急 谢谢array(1) { ...

  7. aspx后台页面添加服务器控件

    System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); System.IO.StringWriter st ...

  8. ArcGIS Engine开发之旅05---空间数据库

    原文:ArcGIS Engine开发之旅05---空间数据库 1  Geodatabase概念 Geodatabase是ArcInfo8引入的一种全新的面向对象的空间数据模型,是建立在DBMS之上的统 ...

  9. 转:ASP.NET MVC + EF 更新的几种方式

    1.常用 db.Entry(实体).State = EntityState.Modified;db.SaveChanges(); 2.指定更新 db.Configuration.ValidateOnS ...

  10. How to control printer orientation(Landscape / Portrait) for an AX report in X++

    You should try this: 1. Set property Orientation on your report design to Auto 2. In your fetch meth ...