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. Nginx配置文件详细说明[转]

    在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #运行用户user www-data;    #启动进程,通常设置成和cpu的数量相等worker_process ...

  2. Lazarus解决无法识别中文路径的方法

    procedure TForm1.Button1Click(Sender: TObject); var FileN:string; begin if self.OpenDialog1.Execute ...

  3. AES加密时抛出 Illegal key size or default parameters

    使用AES加密时,当密钥大于128时,代码会抛出java.security.InvalidKeyException: Illegal key size or default parameters Il ...

  4. Java 获取类名,函数名,行数

    C++下用宏来实现.分别是__FILE__,__func__,__LINE__分别代表,C++编译自动在每个文件中设定__FILE__类型是字符串常量 ,将__LINE__替换为当前行数,类型是数字常 ...

  5. 文件管理php代码操作文件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. nrf51822-使用16位自定义UUID

    以 ble_app_uart为例 工程中创建的nus服务以及其中的两个特性值都是128位的UUID.nordic sdk中使用128位UUID的方式和标准128UUID类似,它是提供一个基准UUID, ...

  7. js严格模式“use strict”

    js的严格模式会放弃js中的一些不正规的写法,参考 http://www.cnblogs.com/God-Shell/p/3139329.html: 使用声明"use  strict&quo ...

  8. [LeetCode] Regular Expression Matching(递归)

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...

  9. Fiddler-008-简单模拟性能测试

    通过 Fiddler 可以简单的模拟性能测试的并发测试,此方法非常的简单,直接讲述如何使用,敬请参阅! 首先我们要获取需要并发的 HTTP请求,此操作非常简单,则在此不再赘述.获取到响应的 HTTP请 ...

  10. Objective-C类成员变量深度剖析

    目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objec ...