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. MySQL出现大量unauthenticated user的问题

    发现这算属MySQL的一个bug,不管连接是通过hosts还是ip的方式,MySQL都会对DNS做反查,IP到DNS,由于反查的接续速度过 慢(不管是不是isp提供的dns服务器的问题或者其他原因), ...

  2. 去除字符串中空格的方法(2016.1.12P141-2)

    // forif来处理空格 // 方法一 String str = " ww sse rr"; String str1;// 定义一个中间变量 String str2 = &quo ...

  3. selenium By 元素定位详解

    转自:http://blog.sina.com.cn/s/blog_6966650401012a6u.html WebDriver拾级而上·之三 定位页面元素 selenium-webdriver提供 ...

  4. jboss4.2.3建立oracle JMS应用

    一.基本配置 1 增加oracle驱动文件,ojdbc6.jar,不能使用小于该版本的jdbc驱动,jboss-4.2.3.GA\server\default\lib 2 增加retrotransla ...

  5. Super不要在Super构造器中调用覆盖方法

    import java.util.Date; public class Super{ public Super(){ System."); overrideMe(); System.&quo ...

  6. Python中Unicode字符串

    Python中Unicode字符串 字符串还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte ...

  7. phpcms v9模版调用代码大全(全面而实用)

    首页调用栏目 {pc:content action="category" siteid="$siteid" num="15" order=& ...

  8. centos apache安装和设置

    分类: LINUX 安装方式:yum install httpdyum install mysql-serveryum install phpyum install php-mysql 一.WEB服务 ...

  9. Maven实战(七)settings.xml相关配置

    一.简介 settings.xml对于maven来说相当于全局性的配置,用于所有的项目,当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们 ...

  10. [LeetCode]题解(python):088 Merge Sorted Array

    题目来源 https://leetcode.com/problems/merge-sorted-array/ Given two sorted integer arrays nums1 and num ...